8 ms·
Ask HN: How to avoid being a pragmatic programmer?
And instead take the time to study a topic deeply? I find myself finishing endless user stories but my technical skills seem stagnant....
- pabs3 4y agoPick a bug that affects you in open source software you use but never touched, dive into the codebase, fix the issue and contribute back. Now repeat for another issue on the same codebase, but one that doesn't affect you.
- trog 4y agoThis is my favourite response. As a manager, I actually really like working with devs that just put their heads down and churn through tickets. My focus is trying to implement the business strategy and having developers that allow us to execute by building what is needed is excellent. Developers (and I include myself in this bucket as I am 1000% guilty of it) are very easily distracted by The New Shiny, and sometimes it's irresistible to dive off into rabbit holes under the guise of 'learning new things'. Too many times I've ended up with massively over-engineered solutions that use experimental stuff that adds business and/or operational risk. I know how soul-destroying it is to simply sit there pulling ticket after ticket though so I carve off time explicitly for self-directed learning & [what I hope are] fun little skunkworks projects. My goal is to try to find a balance between executing business strategy and continual improvement and development (heh) of my team. But your solution sounds awesome. I would love my team to get more involved in open source projects & might suggest this as something to do as part of their usual workload. I wish I'd spent more time doing this when I was more actively programming myself.
- pabs3 4y agoSome potentially useful advice below. Remember to apply it to all the software you use, including operating systems on local machines, company infrastructure, things you deploy in the cloud etc. Possibly your team has added workarounds and technical debt to your codebase for issues in your dependencies, that is probably a good place for them to start. It is also nice to give back to projects by working on "papercuts"; things that are easy to fix but annoy lots of people (Ubuntu did this for eg). Working on bigger stuff is good too, like fixing all crashes or adding important features from the roadmap etc. https://ubuntu.com/blog/tag/papercuts https://ubuntu.com/blog/tag/papercuts https://wiki.ubuntu.com/One%20Hundred%20Papercuts/Mission https://wiki.ubuntu.com/One%20Hundred%20Papercuts/Mission Some companies have a "20% time (or X hours) on open source" policy, which is great for the sort of issues mentioned above. Some open source projects have a list of ways companies can support them with resources (like sponsorship, download mirrors etc), for example here is the one for Debian: https://www.debian.org/intro/help#organizations https://www.debian.org/intro/help#organizations It is a good idea to reword your employee contracts to mention the company policy on open source and give employees copyright over their contributions to open source projects. Some projects like Samba do not allow corporate copyright ownership. For other open source projects, having a diverse copyright holder base of individuals and a broad contributor community helps protect projects (at least those that are copyleft) from license and other changes brought on by company acquisitions, industry competition and other corporate influences. https://sfconservancy.org/contractpatch/ https://sfconservancy.org/contractpatch/ If you want more separation between your company software and open source software, an Open Source Program Office or just an internal "open source team" is a good idea, although it is always a good idea for lots of folks to have open source experience, so rotating other employees through the team for periods/percentages of time might be good too. https://blog.opensource.org/what-is-an-open-source-program-office-and-why-you-should-have-one/ https://blog.opensource.org/what-is-an-open-source-program-o... When setting up an internal "open source team", the FOSSjobs website and the other job aggregators linked from the FOSSjobs resources wiki might help you hire new open source folks. https://www.fossjobs.net/ https://www.fossjobs.net/ https://github.com/fossjobs/fossjobs/wiki/resources https://github.com/fossjobs/fossjobs/wiki/resources PS: if you need advice more specific to your situation, see my profile.
- trog 4y ago> Some companies have a "20% time (or X hours) on open source" policy, which is great for the sort of issues mentioned above. We have this as an unwritten policy at the moment (... that I have been trying to get formalised for a while & need to follow up!). > It is a good idea to reword your employee contracts to mention the company policy on open source and give employees copyright over their contributions to open source projects. This is an excellent idea - thanks. > If you want more separation between your company software and open source software, an Open Source Program Office or just an internal "open source team" is a good idea, although it is always a good idea for lots of folks to have open source experience, so rotating other employees through the team for periods/percentages of time might be good too. We are not quite big enough (yet) for this, but something like this is already on our radar. We have a pretty major dependency in our stack that is starting to look a bit abandoned & have been idly discussing the possibility of hiring someone to maintain it. Appreciate the feedback!
- kebsup 4y agoI found that I dive deeply into topics only if I work on my own projects. Studying stuff out of interest and being paid for it does feel right.
- suprjami 4y agoSolve real problems. Nothing provides motivation like needing to solve something for someone else. If you feel you don't have access to real problems, go and work for tech support a bit. You'll get them eventually.
- mherrmann 4y agoYour definition of pragmatic programmer seems to be different from mine. In the classic book The Pragmatic Programmer [1], a pragmatic programmer is described as someone who knows their tools well, learns continuously, writes clean code, etc. I don't think going into depth contradicts any of these traits. Regarding your question, why not find a new job / role? For example, I was curious about VR but knew nothing about it. So I got a VR gaming company to hire me as a freelancer at a much reduced rate for a few weeks. It was a great way to delve into the technical aspects of the space. Alternatively, you could start a hobby project where you go into depth. 1: https://pragprog.com/titles/tpp20/the-pragmatic-programmer-20th-anniversary-edition/ https://pragprog.com/titles/tpp20/the-pragmatic-programmer-2...
- alrlroipsp 4y agoRather than assuming a definition, lets try to figure out what it means, ey. adjective: pragmatic dealing with things sensibly and realistically in a way that is based on practical rather than theoretical considerations. In the context of programming this implies reaching for a ready made solution rather than re-inventing the wheel, avoiding implementing unused features, not spending time fighting code formatting and so on. Anyway, I think OP is confusing the term too
- OJFord 4y agoI think OP's closer in literal meaning to be honest, though missing a 'too' or something. However, as GP points out, it's such a recognisable phrase with a slightly tangential or at least specific meaning that OP's question probably isn't quite what people expect (or they don't know what to expect) from the title.
- deleted 4y ago[deleted]
- Bakary 4y agoPragmatic usually implies a certain down-to-earth personality, but there's no contradiction in being pragmatic about something abstract and long-term. Our goals are all irrational or based on emotion in some way, but we can use "logical" strategies to move towards them.
- throwaway0asd 4y agoAdd time for performance measures, security, accessibility, documentation, and test automation.
- pmontra 4y agoStart something from first principles. Examples: Instead of using a middleware between a web server and an application, write one (of course it was easier when I did it in 1994.) Instead of using an IDE that magically recompiles Java and brings you to the errors, write the code that monitors the file system and runs javac, etc (2005). Instead of using a CMS, write one (did it in Perl in the 90s.) Instead of using a JS framework, write one (I kind of tried but no time for it.) You'll find something that's relevant today and for your work. There is no need to go on for too long because this approach is good for learning but bad for productivity. The problems to solve and the plausible solutions get clear pretty soon. The problem, as always, is the time.
- shakezula 4y agoI cannot support this advice enough. I recently did this with an exchange/order-filling engine in Go and it was a great little toy project. You’ll learn a ton about some things you don’t typically get to dive into when you take the “first principles” approach.
- dev_0 4y agoHow did you get the idea to work on this project? Which resources to research on etc.?
- shakezula 4y agoHonestly, I was just reading crypto news about an exchange one day and thought “that would be an interesting problem to tackle” and so I went for it. I have been meaning to post that to HN for a few weeks now, tbh.
- dev_0 4y agoSounds interesting.....but seems like the knowledge for this domain is exotic...
- 4y ago
- Dave3of5 4y agoIf you are working for a company doing SCRUM then you will only just work on stories. That's it. If you want anything else from your programming career then you'll need to do it yourself.
- OJFord 4y agoI don't understand why it seemingly doesn't bother more people, always feels like that 'there are dozens of us!' meme when something like this is posted here. Scrum is depressing, it makes miserable factory-like work (or makes miserable factory-like work unapologetically transparent, perhaps). I can't think of any other profession that it wouldn't shock me to hear they work like this.
- jlokier 4y agoCompanies that are very Scrum focused aren't actually all that common in my experience. If your job is depressing because of it, it may be time to look around. Remember to ask how the new place does things, so that you're not stuck with more of the same.
- OJFord 4y agoNot in the sense of 'scrum masters' and certification and all that - that sounds bad but in a different way and I've never experienced it. I just mean 'sprints' and 'tickets' and 'points' and 'stand-ups' really. (Which I assume isn't what you're saying isn't that common, certainly seems it from.. HN I suppose.)
- Ensorceled 4y agoHow much time are you spending on these artifacts? Sprint planning and 'tickets' should take at most a few hours a sprint for developers (my effort is much higher, of course), standups are 15 minutes a day, points are just estimates.
- 4y ago
- SanderNL 4y agoThe short answer is get a job that is actually interesting. I'm sad to say that - IMHO - software engineering as a profession is not looking too great right now. My long answer is that the job is - despite the money - quite "blue collar". I guess an effect of it becoming mainstream among other things. A vast majority of programmers' jobs are connecting various types of tubes together and endlesly discussing minor variations of the same basic themes. You will find yourself (re-)implementing CRUD interfaces, auth flows, database models. If you're lucky you'll spend some time messing with your cloud provider of choice's various control panels or may work on massaging some data for the AI guys. That's basically it and you're getting paid for it quite handsomely so I'm not sure we should voice our concerns too loudly, but it can be soul-draining nonetheless. What works for me is to get a job that's not micromanaged to the death. Some jobs, especially at smaller companies, pose a very interesting challenge. I guess the restricted resources, (usually) passionate leadership and sense of personal achievement makes these types of jobs more fun for me. There are usually no playbooks, no protocols. There might not even be an understanding of "user stories": you'll be the one that'll introduce it. It'll teach you all kinds of interesting things about management, planning, people etc. There can be excitement there that is completely drained out of the larger corporations. It could also be hell, so your mileage may vary.
- noir_lord 4y agoI've maintained for a long long time that programming in the real world is more akin to a blue collar job than most people would suspect (and I worked blue collar, I qualified as an industrial electrician when I was young). I think the way we prepare programmers for industry would benefit much more from an apprentice model than what we currently do, though of course since I'm in the UK and that would require employers investing in employees so that'll never happen. Somewhere like Germany could make it work better though since they have a stronger program for that stuff generally. It's such a vast field that the vast majority of programmers aren't doing bleeding edge stuff.
- SanderNL 4y agoThere's definitely overlap between those concepts. There are also some differences. I guess it depends on the nature of that specific job if it's "blue collar" or not. I get the feeling from the poster that they are in a "blue collar" environment. Fully managed, working a specialized assembly line. No time for anything else but whipping up the next widget. There are also SE jobs where you have to be everything. Tweaking servers, calling customers, designing and implementing backends, some frontend work, maybe even helping out with the company website. Meeting with CEOs of partnering companies. I don't see typical blue collar workers doing well in that sort of situations.
- jrumbut 4y agoYou could do a PhD or just work in a research environment where they support the staff taking time to do these deep dives. My experience has been that research teams allow their members to organize their work however suits them, if that's stories then do stories, if it isn't then no stories needed. Edit: I should note either of these will probably involve a pay cut.
- f0e4c2f7 4y agoMake a list of things to learn and start working through it in your off time. I put LISP on mine 22 years ago and still haven't got to it yet. New stuff keeps getting added.
- democracy 4y agoBuild your own projects. Otherwise you are doomed. Or switch jobs every few years.
- omginternets 4y agoIn my experience, studying a topic deeply is similar to going to the gym. It requires that you dedicate time to it very regularly, and being regular is far more important than the duration of individual sessions. Also like going to the gym, it's extremely hard to maintain the required regularity if you aren't enjoying it. The only way I have found to consistently work out is to find a deeply technical sport (BJJ, not that it matters) that I actually care to do well. It's the same with technical subjects; the only ones I'm able to study deeply are the ones I find deeply interesting. With this in mind, my advice is as follows: approach "deep study" in a playful way, and study topics that interest you without regard for whether or not they are "useful". The utility is never far behind, anyway.
- samatman 4y agoYou've answered your own question: take the time to study a topic deeply. The top answer as I'm writing this says coding is a blue-collar profession, very well, a lot of it is. I don't know if this is current, but we used to call these "line coders", nothing wrong with it, it's honest work. But coding is also a specialist occupation with many niches. Find one you like, and master it, to the point where you're advancing the state of the art. Congratulations, you're an expert now. The color of your collar should matter a lot less.
- shp0ngle 4y agoOn every project, there are always some “hard problems”. Parts of the code nobody wants to touch. Tasks that seem too big. Work on those. Attack the hard problems. And if your work code doesn’t have those hard problems, you probably have a lot of free time, so get a compiler course somewhere or something.
- schwartzworld 4y agoI love doing side projects in other languages / frameworks, mainly ones with very different philosophies. It gets me thinking in a different way, and I bring that new mode of thought back to my work. I mainly work in React with TypeScript, and most of the devs I know rely heavily on plain objects and arrays, writing a lot of glue code to squeeze these square pegs into all the different shapes holes they need. There is a lot of opportunity to model your state and data flows using whatever programming technique I'm interested in, along with the added challenge of implementing those in a way that other devs will be able to understand. Trying to straddle this line has absolutely made me a better developer. Some examples: - Forth emphasizes using small, reusable "words" which you then build on top of each other to essentially create a DSL for describing your app / data. - Rust has a great type system which improved my understanding of TypeScript. It also has really sexy monadic data types like Either and Result that you can implement in TS/JS. - Elm is a pure functional language that compiles to HTML CSS and JS. Any amount of time spent with Elm will make a better React dev. - Lua is close to JS but lacks a lot of the niceties. If you want classes or arrays or anything like that, you pretty much have to implement them yourself. None of my side projects are world changing, but the effect they have had on my day-to-day code is significant. Programming teaches you new modes of thought, and the more you are aware of what goes on in these other parallel worlds, the more fun it becomes to try and tackle problems that are hard in your language / framework, but easier in others. I also spend a lot of time listening to technical podcasts. I always recommend that JS / TS devs listen to the LambdaCast, which hasn't produced an episode in 3 years, but is still a very valuable resource. I also like the ArrayCast (array programming language nerds talking about array programming).
- spit2wind 4y agoI'm currently in the middle of reading "So Good They Can't Ignore You" by Cal Newport. In Chapter 7, he tells a story of chess masters which compares those who trained by study and those who trained by competition. The conclusion was those who trained primarily by study vastly dominated. The reason being that by study they could always exist in the zone of proximal development whereas the other group was subject to the peers they were arbitrarily paired with. What at your job pushes you just beyond your current skill level?
- Bakary 4y agoA competing explanation is that the chess masters for whom study is particularly advantageous are also those who happen to be able to dominate their peers. Magnus' capabilities seem to be a testament to that. There is also the aspect of computer analysis multiplying the effectiveness of chess study versus real life competition.
- aynyc 4y agoIn coding, this is an example of boot camp (project based) vs CS degree (or long term self-study). In the last 5-10 year in my job, I saw significant amount of boot camp grads who can make CRUD/ML apps fast and relatively clean. As soon as anything goes wrong, boot camp grads would look for another technology to solve symptom of the problem without understand the cause, while the second group consistently perform better by working through the problems and develop solutions.
- mateusfreira 4y agoRun a non-commercial side project (Maybe open source) A big part of learning is making mistakes and learning from them. As you grow in seniority, mistakes become more expensive in money and or stress. Trying new things on stable products in big companies is hard. So how do we keep learning? How do we get updated? How do we try new stuff to be seniors on it five years from now? Run a side non-commercial project. Why no commercial? I will get deeper into this soon, but if people are paying for it, downtime, bugs, and instability are not quite acceptable. While learning, you probably have all of those, sometimes multiple of them, at the same time.
- mateusfreira 4y agoTo experiment and make mistakes that don’t cost me a lot of money or cause too big a problem, I must have a side project. I wanted to learn rust deeply, and it would be impossible to do so if I had not started NunDB. On Nundb, I can work 10 hours a week or no hours at all without any problem. If I have one hour to code, that is enough for me to do something on NunDB, it requires much more coding than my other two activities, and I still only have a hand full of people using it and only one single critical application, so there I can experiment, learn, have fun.
- Jtsummers 4y ago> And instead take the time to study a topic deeply? Three options: 1. Go back to university, get a PhD 2. Go work for a research institute (may require (1)) 3. Become a subject matter expert (SME) and focus on one area of the business > I find myself finishing endless user stories but my technical skills seem stagnant Well, you already aren't a pragmatic programmer then. You should be constantly learning, constantly looking for new and interesting work (internal or external to your employment). Engaging with your management to get put on the more interesting tasks. Want an example of a pragmatic SME I knew? He was a EE, wanted to do software. So he bought a couple embedded dev boards and started learning. He brought in a demo to the software manager and said, "I want to be on your team, here's what I can do now." The manager was impressed and they moved him over to that team. He was truly a subject matter expert, and also pragmatic. Funny, no conflict between the two.
- pabs3 4y agoIf you want a particular deep topic, Bootstrappable Builds is possibly my favourite these days: https://bootstrappable.org/ https://bootstrappable.org/