Jorge Manrubia Profile
Jorge Manrubia

@jorgemanru

3,162
Followers
224
Following
38
Media
135
Statuses

Programmer @37signals . Writing: 👋 jorge @hey .com

Valencia, Spain
Joined September 2019
Don't wanna be here? Send us removal request.
@jorgemanru
Jorge Manrubia
10 months
@paulg This looks identical to what we Europeans have to do now to visit the US (ESTA) 😬
Tweet media one
7
3
383
@jorgemanru
Jorge Manrubia
7 months
Here's an article version of the upcoming Turbo 8 stuff I presented in Rails World last week.  My favorite feature is that we are not adding new programming paths but giving you fewer reasons to abandon the happy one based on full-page responses.
Tweet media one
15
48
227
@jorgemanru
Jorge Manrubia
2 years
A common critique of Rails is that it encourages a poor separation of concerns. That when things get serious, you need an alternative that brings the missing pieces. We disagree. Vanilla Rails is plenty:
Tweet media one
16
40
211
@jorgemanru
Jorge Manrubia
6 months
You are an individual contributor at heart. You like writing code and solving technical problems. You dislike meetings and ceremony. Here’s what you can do to maximize what you like and minimize what you don’t: radiate information.
3
27
118
@jorgemanru
Jorge Manrubia
1 year
"I believe Active Record is so good that it eliminates the traditional reasons for a strict separation of persistence and domain logic. I consider that a feature to embrace proudly, not a choice to justify." Active Record, nice and blended:
4
19
109
@jorgemanru
Jorge Manrubia
2 years
A story of a Safari bug breaking WebSockets and how we fixed it in Basecamp and Rails. Featuring Apple not caring much 😅.
Tweet media one
4
11
105
@jorgemanru
Jorge Manrubia
2 years
This solves a problem many Rails apps will face: perform the initial encryption in existing applications.
Tweet media one
0
13
74
@jorgemanru
Jorge Manrubia
8 months
Paying attention to the small stuff in pull requests is part of our development culture. This is how new people learn the in-house coding style, how we keep a high-quality bar in our code, and how we favor consistency.
8
16
73
@jorgemanru
Jorge Manrubia
11 months
Success stories normally omit the bumps along the road, but reality rarely works like that. Also, who doesn't love a good Friday incident 😅?
Tweet media one
1
5
71
@jorgemanru
Jorge Manrubia
9 months
Software development is so complex that it benefits from nuance. The advice of the kind "never-ever do this, always do that" should put you on alert. "Globals, callbacks and other sacrileges"
1
13
69
@jorgemanru
Jorge Manrubia
1 year
"As long as it doesn’t smell like dogma or is used as a weapon to attack others’ professionalism, I have no problems with TDD. I just see it as a tool I don’t use."
Tweet media one
7
16
66
@jorgemanru
Jorge Manrubia
7 months
As part of our exploratory work for smoother page updates in Turbo, we investigated using server-side diffing. Here's the story, including an internal video and prototype source code.
Tweet media one
5
3
59
@jorgemanru
Jorge Manrubia
2 years
> Do people lose interest in programming as they age? Is it accurate to expect that older programmers are slower, make more mistakes, and would rather be doing something else such as managing programmers? No, no and no.
Tweet media one
6
11
37
@jorgemanru
Jorge Manrubia
2 years
We used scientist to refactor a critical code path in HEY. Veredict: 👌.
Tweet media one
0
7
32
@jorgemanru
Jorge Manrubia
2 years
I think a problem with Rails concerns is that they don't come with a user manual, and misusing them can cause more harm than good. I do believe they are an amazing resource, so I wrote some notes on how to leverage the good parts they have to offer:
Tweet media one
4
10
31
@jorgemanru
Jorge Manrubia
2 years
Some thoughts on utility-first CSS and Tailwind. I can't say I am a fan.
Tweet media one
4
5
30
@jorgemanru
Jorge Manrubia
3 years
A few things I wish someone had told me right after college:
Tweet media one
0
6
29
@jorgemanru
Jorge Manrubia
2 years
How to create a good domain model is the subject of many books, but here's a lesson I learned at 37signals: don't be aseptic; double down on boldness.
Tweet media one
4
7
28
@jorgemanru
Jorge Manrubia
1 year
"I suspect that my exposure to fancy Java IDEs early in my career made my mental model for editing code incompatible with plain editors." Here are some thoughts on why I've been using @rubymine for the last ten years to code Rails apps.
Tweet media one
3
5
27
@jorgemanru
Jorge Manrubia
7 months
@lazaronixon We're using ice_cube. Same in Basecamp.
Tweet media one
3
0
25
@jorgemanru
Jorge Manrubia
2 years
"When working remotely, this is a great habit: make decisions and communicate them, but try to avoid getting blocked waiting on others."
Tweet media one
0
4
22
@jorgemanru
Jorge Manrubia
2 years
Fractal is about similar patterns recurring at progressively smaller scales. To me, good code is a fractal: you observe the same qualities repeated at different levels of abstraction.
Tweet media one
2
2
20
@jorgemanru
Jorge Manrubia
1 year
Four years ago, I wrote about considering Rails instead of the SPA path. Since then, Rails got much better with Hotwire and the improved JS bundling; I'm genuinely curious about the JS scene. It looks as messy as ever whenever I try to catch up.
2
0
17
@jorgemanru
Jorge Manrubia
1 month
@excid3 @_swanson Godo points by @_swanson . To take a positive outlook, I think it encourages you to write better stimulus controllers. Stimulus is designed to work dynamically with elements that get added or removed from the DOM. If your controller modifies the DOM, it should be prepared to work…
1
0
16
@jorgemanru
Jorge Manrubia
2 years
@_swanson We consider jobs like controllers: consumers of business logic exposed via high-level/natural APIs in domain models. Almost all our jobs just invoke a method in a model. We use a convention in many models with "<method>_later" enqueuing a job that invokes "<method>". Example:
Tweet media one
2
0
15
@jorgemanru
Jorge Manrubia
3 years
Deadlines in software can be awful... or a powerful decision-making tool.
0
4
15
@jorgemanru
Jorge Manrubia
2 years
The same performance penalty can be unacceptable or negligible, it’s all about the context.
Tweet media one
0
7
14
@jorgemanru
Jorge Manrubia
7 months
@julian_rubisch Hey Julian, sorry you feel that way. I have nothing but respect about your work folks, but CableReady uses a completely different approach and philosophy to what we are presenting here, even if the goal is the same. No mention to it because it had no influence on us here, really.
2
0
12
@jorgemanru
Jorge Manrubia
2 years
I used to be eager to discuss design with designers. Today, I establish self-imposed boundaries. Some thoughts on design from my programmer eyes.
Tweet media one
1
0
13
@jorgemanru
Jorge Manrubia
1 year
Since almost nobody is talking about ChatGPT... The augmented programmer:
Tweet media one
0
2
12
@jorgemanru
Jorge Manrubia
2 years
@ciaran_lee Thank you so much @ciaran_lee ! That was the development preview, which wasn't meant to be published 😂. It was planned for next week, but thanks to somebody who found it, we just published our new 37signals dev blog for good ✌️:
3
5
11
@jorgemanru
Jorge Manrubia
1 year
"I’m very wary of making predictions in tech, but you don’t have to be Nostradamus to realize that a major change will happen, and it will be fast." Learning with ChatGPT:
Tweet media one
0
0
11
@jorgemanru
Jorge Manrubia
2 years
This question applies to most people, and it certainly applies to me: does it make sense to write without an audience? It does.
Tweet media one
0
0
10
@jorgemanru
Jorge Manrubia
2 years
"If you are still in the Intel kingdom, consider visiting M1-land as soon as you can."
Tweet media one
0
1
9
@jorgemanru
Jorge Manrubia
1 year
In recent times I've become more intentional about using writing for thinking. Not to communicate or publish anything, just to clarify my thoughts. I've come to love the process of starting with fuzziness and seeing where writing takes me.
Tweet media one
1
0
9
@jorgemanru
Jorge Manrubia
2 years
Six macOS apps I love: Task Paper, Craft, Moom, Cleanshot, Reeder and Alfred:
Tweet media one
0
0
8
@jorgemanru
Jorge Manrubia
2 years
@rbates We do! We have plenty of folders and subfolders. Notice that this 500 includes all the files in our /models folder, including POROs and model-specific concerns (output of "rails stats"). I shared some details on where we place concerns here
Tweet media one
0
1
8
@jorgemanru
Jorge Manrubia
10 months
Whenever I see people telling others how to live, I can’t help wondering: isn’t figuring out what works for you already difficult enough? Let people be.
0
1
8
@jorgemanru
Jorge Manrubia
11 months
"The failed experiment wasn't remote work but rewiring your company from the ground up. That makes for a less clickable headline, though, and is probably a harder pill to swallow for the people running the show." Remote struggles:
Tweet media one
0
1
8
@jorgemanru
Jorge Manrubia
11 months
If you have to drop some code, don’t console yourself with, “at least I learned something”. That’s your subconscious wanting to make software development predictive. Instead, cheers with “I finally understood the problem!”. Erase and rewind:
Tweet media one
0
0
8
@jorgemanru
Jorge Manrubia
1 year
@rbates If it serves, I'm the only RubyMine user at 37signals and the extensive usage of concerns was already there when I arrived. So not an enabling factor in our particular case, but I agree RubyMine helps browsing code a lot 😅.
2
0
8
@jorgemanru
Jorge Manrubia
1 year
@rbates Isn't it as difficult as locating parent methods? I wrote a piece on concerns here . With RubyMine, I just browse to the method definition, but the "model folder" convention should help with plain search too.
2
0
7
@jorgemanru
Jorge Manrubia
1 year
@fxn With the M1 I remember some initial friction with Docker but that was fixed a while ago. I think the switch should be pretty smooth today. Also, the mind-blowing performance gain compared to Intel should make for unexpected hiccups.
0
0
6
@jorgemanru
Jorge Manrubia
1 year
@pmareke I don’t really know. I know the combo of Rails API + JS-powered client is quite common but no clue about the numbers. With the JS movement in favor of server-side rendering, and with how powerful Hotwire is, I would imagine vanilla Rails is gaining popularity again.
1
0
4
@jorgemanru
Jorge Manrubia
1 year
@lazaronixon Not at all 😅! My goal is to hopefully present alternatives for those exposed to dogmatic takes, which are a thing in our industry.
0
0
5
@jorgemanru
Jorge Manrubia
2 years
I usually brace for impact when dealing with customer support in large companies, but this time I was wrong.
Tweet media one
0
0
4
@jorgemanru
Jorge Manrubia
2 years
"Any task manager can list the things you got done; the value resides precisely in what's missing in such report [...] The human ingredient is the secret sauce here." What did you work on today?
Tweet media one
0
0
4
@jorgemanru
Jorge Manrubia
1 year
@hopsoft Yes! I've use it recently a couple of times to serialize POROs in ActiveJob arguments. It's more concise than the built-in custom serialization mechanism IMO.
0
0
4
@jorgemanru
Jorge Manrubia
18 days
@mhenrixon @joeldrapper @37signals Lots of thoughts about services indeed. Shared the gist of it here . The heuristic you mention of using a service whenever 2+ objects collaborate feels detached from what a service is: a domain operation that doesn't belong to any domain entity. And a…
1
0
4
@jorgemanru
Jorge Manrubia
1 year
@happywebcoder 1000 gracias Raul 🙏🙏🙏
0
0
3
@jorgemanru
Jorge Manrubia
1 year
@JasonSwett 👏👏 En el próximo podcast hablamos de Rails vainilla 😜
1
0
3
@jorgemanru
Jorge Manrubia
10 months
The primary driver for people participating in public shaming is not justice but primarily hedonic – it makes participants feel good. I revisited my thoughts after reading an article referred by @JonathanShedler :
0
0
3
@jorgemanru
Jorge Manrubia
2 years
@marcoroth_ @joeldrapper @_swanson @hopsoft Nice gem. I remember DelayedJob used to let you do this back in the day (pre-Active Job times).
0
0
2
@jorgemanru
Jorge Manrubia
1 year
@naofumi I should write about this to clarify my own thoughts about it 😅. I think adding mandatory application-level elements to connect controllers with models makes designing good domain models harder for everyone, but especially for less experienced folks, because boundaries are fuzzy
1
0
3
@jorgemanru
Jorge Manrubia
1 year
@fxn @asterite Thanks @fxn and @asterite ! Funny thing is that I used this last year for a case in HEY and then forgot about it 😂. I added a memorizable concern, and I was using it like that, but eventually dropped the idea as I wasn’t super convinced about how it looked with that “memoize def”
Tweet media one
Tweet media two
1
0
3
@jorgemanru
Jorge Manrubia
1 year
@gorkula @AlejSalado @carlossaladoart @OmarGarciaG7 Pues mira, mi piano ya ha servido para algo 😂🤘
0
0
3
@jorgemanru
Jorge Manrubia
2 years
"Software design is a complex matter, and I think this is why axiomatic advice about where to place code is so appealing: it is simple."
Tweet media one
1
0
3
@jorgemanru
Jorge Manrubia
2 years
Rails attributes: an essential API you can probably ignore.
Tweet media one
0
1
3
@jorgemanru
Jorge Manrubia
7 months
@hopsoft @fractaledmind @julian_rubisch Philosophically, SR departs from how regular apps work requiring a persisting Websocket connection, while what we present is a progressive enhancement over regular web programming, in the spirit of Turbo. No criticizing at all, just saying the approach is completely different.
1
0
3
@jorgemanru
Jorge Manrubia
1 year
@jbbonin I can't think of a case where we combine both, but I don't see a reason to not do that if needed. I can think of an example where we use inheritance on the delegated type side without STI (self.abstract_class = true), but I think STI would work too.
0
0
2
@jorgemanru
Jorge Manrubia
1 year
@diana_aceves_ @rosapolis @pamplonaswcraft Como compañero de Rosa puedo confirmar que quedarse con la boca abierta al verla en acción es habitual en general 😊.
0
0
2
@jorgemanru
Jorge Manrubia
1 year
@fxn Wait, are those pairs pronounced differently?
0
0
2
@jorgemanru
Jorge Manrubia
1 year
@_beauraF By fuzzy I mean that they don’t always look like an operation you perform or execute, and that’s a good thing IMO. They exist to encapsulate an operation, but you can still try to find better terms than “perform” or “execute” if possible.
0
0
1
@jorgemanru
Jorge Manrubia
1 year
@pmareke @JasonSwett Rails’ terminology for tests is a bit confusing. We mostly use plain unit tests for Active Record models and regular models, integration tests for controllers and system tests for browser-testing the app. And we use the defaults: minitest and fixtures versus rspec and factory_bot
2
0
1
@jorgemanru
Jorge Manrubia
1 year
@rbates Concerns are a tool and you can definitely create a mess with them, but I also believe they can enhance readability when used right. I also believe the common comparison with object composition is a false dichotomy: different tools for different purposes that play great together.
1
0
2
@jorgemanru
Jorge Manrubia
1 year
@_beauraF Signing up is a good example (from my vanilla rails article). I can think of two I created for HEY, to change email addresses and to validate SMTP accesses. The line is fuzzy, though, I guess that’s why we don’t given them special consideration. Check how the smtp one looks:
Tweet media one
1
0
1
@jorgemanru
Jorge Manrubia
1 year
@noelrap @rubymine Same here. Constants hangs whenever I start the IDE, change branches or even while just working on things. I've noticed a tremendous regression in terms of performance with the last release.
0
0
2
@jorgemanru
Jorge Manrubia
1 year
@_zzJZzz_ Yes! I don’t remember an interaction where it was totally useless. It usually nails what I ask for, but even when not, it’s still very helpful. It’s the opposite of what I’ve always experienced with other language-powered AI systems.
0
0
2
@jorgemanru
Jorge Manrubia
1 year
@dakull @rockatanescu @rubymine Several people have pointed out similar reasons, so there must be something there for sure. I had never thought of that angle. Thanks!
0
0
2
@jorgemanru
Jorge Manrubia
1 year
@drale2k Thanks. Contact belongs to account too, just ommitted in the shared snippet.
1
0
2
@jorgemanru
Jorge Manrubia
2 years
@lazaronixon Thanks Lázaro! Yes, I'd love to write a piece on vanilla Rails with special attention to the controller layer. When I landed at 37signals I was surprised about how vanilla they were in general.
0
0
2
@jorgemanru
Jorge Manrubia
8 months
@fxn I’d love to see that talk. I agree that deadlines to guesstimate times and costs are useless and stress-inducing, but find them super-valuable to help making scope-related decisions. Wrote about this here
1
0
1
@jorgemanru
Jorge Manrubia
2 years
@_swanson I see your point about ActiveJob with perform_now being like a service, but in our case we avoid putting logic in our jobs in general. We see jobs as a mere mechanism to invoke domain model operations asynchronously, so that's what our approach reflects.
1
0
1
@jorgemanru
Jorge Manrubia
1 year
@smlpth We are not fans. We don’t use sorbet or typescript in our apps. I wrote some opinions on this back in the day . I’m sure there’s a case for them though, either for personal preferences or for organizational size.
0
0
1
@jorgemanru
Jorge Manrubia
2 years
@GregMolnar @37signals @seanmitchell Yes, thanks Greg! We'll fix that. We wasn't actually planning to go live today with the blog 😅:
@jorgemanru
Jorge Manrubia
2 years
@ciaran_lee Thank you so much @ciaran_lee ! That was the development preview, which wasn't meant to be published 😂. It was planned for next week, but thanks to somebody who found it, we just published our new 37signals dev blog for good ✌️:
3
5
11
1
0
1
@jorgemanru
Jorge Manrubia
1 year
@BijanRahnema Haha I love it!
0
0
1
@jorgemanru
Jorge Manrubia
2 years
@Ken55172479 Hey thanks for the heads up Ken. No problem at all from my side. I love to learn that my article resonated in China too!
0
0
1
@jorgemanru
Jorge Manrubia
1 year
@kirantpatil @37signals Sorry, not public yet. I'm sure we'll announce properly as things become ready to share.
0
0
1
@jorgemanru
Jorge Manrubia
1 year
@jonynovaretti To use an example, I think it’s great to have a method `Invoice #total ` and it encapsulates dealing with the “invoice line items”, instead of having a service that orchestrates that because there are two models involved.
0
0
1
@jorgemanru
Jorge Manrubia
1 year
@rockatanescu @dhh I think there was a traditional resistance to linters in the company, but they embraced them at some point during HEY development to enforce consistency. We use Rubocop for Ruby and stylelint for CSS, and share the linting rules across apps via an internal gem called house-style.
0
0
1
@jorgemanru
Jorge Manrubia
1 year
@adrienpoly Not in our latest app (HEY), but we have used them in older ones, for example underscore’s templating support in some specific parts of BC3. We aim to avoid them in the new app.
0
0
1
@jorgemanru
Jorge Manrubia
1 year
"Sensations are never part of the distilled list of features we love when comparing products, and yet, they are the essential factor that makes something stand out."
Tweet media one
1
0
0
@jorgemanru
Jorge Manrubia
10 months
@lucianghinda With ChatGPT 4 and a paid plan, you can enable third-party plugins. There are several options for entering PDFs there.
1
0
1
@jorgemanru
Jorge Manrubia
1 year
@joepairman That sounds wise to my ignorant ears 🤔
0
0
1
@jorgemanru
Jorge Manrubia
1 year
@jonynovaretti If that means that you lose having objects that rely on other objects internally when responding to messages, I don’t love it. You would lose two core OO features (composition and encapsulation). I think the key is: “not belonging” to any of the models. Then you have a service.
1
0
1
@jorgemanru
Jorge Manrubia
1 year
@smlpth It’s 18 of PTO + 11 local holidays. Also, you have four months of 4-day weeks in the summer, and you can take a 1-month sabbatical every three years. I think it’s pretty sweet, even for European standards.
0
0
1
@jorgemanru
Jorge Manrubia
1 year
@rockatanescu @rubymine Yeah, those don’t annoy me much. I think I am used to them and just ignore them, but you’re right they are a thing.
0
0
1
@jorgemanru
Jorge Manrubia
1 year
@joshualturner It totally is!!!!
0
0
1
@jorgemanru
Jorge Manrubia
2 years
@weizheheng We typically create tests symmetrically to the concern. So for a "Topic:Deletable" concern we would create a test "Topic::DeletableTest" in "test/models/topic/deletable_test.rb". The test exercises the concern behavior using fixture topic models.
0
0
1
@jorgemanru
Jorge Manrubia
1 year
@ThisIsFernandez ❤️🙏 gracias Miguel
0
0
1
@jorgemanru
Jorge Manrubia
1 year
@jaimeiniesta @JaimeIniestaDev @bandzoogle ! They recently announced the milestone of $100M in commission-free sales. Ran by an amazing crew of people who care. I can’t recommend them enough!
1
0
1
@jorgemanru
Jorge Manrubia
1 year
@fxn @asterite Ooh I had missed that. Very clever. Love it 🙏!
1
0
1
@jorgemanru
Jorge Manrubia
2 years
Not every complex problem offers the chance to apply an iterative approach, but processes and rituals do. Good ceremonies are iterated and distilled:
Tweet media one
0
0
1
@jorgemanru
Jorge Manrubia
1 year
@pmareke @JasonSwett We should definitely improve the guides to include some meaty examples for each kind of test. I’ll see if I can help improving that.
1
0
0
@jorgemanru
Jorge Manrubia
2 years
@trevorturk Oh I had missed that but yes! In HEY and BC4, the admin panels are organized in a namespace as you describe. I'll say hi to Jeff :)!
0
0
1
@jorgemanru
Jorge Manrubia
1 year
@fxn @asterite It would be great if you could place the line above the “def” declaration. It’s minor, but it was something that bothered me. Also, it would be nice to be able to parametrize it, (e.g: lru_cache(max_size: 30)). But in any case, my initial affirmation was indeed wrong, ty 🙏
1
0
1