Live data from Hacker News

Ask HN: How to transition from academic programming to software engineering?

news.ycombinator.com

41–50 of 105 posts

Re: Ask HN: How to transition from academic programming to software engineering?

#41

Some general advice I've given multiple junior developers over the years, you probably aren't a junior but most likely applicable to the advice you are seeking. These were passed down to me by other developers. Other HN folk will have links to literature but hopefully my advice will give you a precursor. * testing - write your functions small enough to be readable, but not so small their abstractions are meaningless…

I couldn't agree more with you about nesting loops. It seems clever at the moment when you're writing but when you have to come back after a while or worse, another developer has to, it becomes a nightmare.

I would also go a bit further and put nesting if statements. Sometimes it's really required but other times nesting can be avoided. I try to avoid nesting as much as possible.

Re: Ask HN: How to transition from academic programming to software engineering?

#42
Get into a startup where a lot of these practices/ideas aren't yet fully ingrained/adhered to and grow with your team. This will also let you learn more skills than "just coding" as you will have to wear multiple hats.

Once you are confident you can move on to bigger engineering shops. Or just stay and have a great time building new things in startup world. :)

Re: Ask HN: How to transition from academic programming to software engineering?

#43
post #15

Your coworkers are your best resource. - Ask them to review your code and suggest changes - Look for questions of taste and ask more. It may feel intuitive to them, but if you dig in you can often find a good reason/principle behind it. - Read your coworkers' code - Read the comments people leave on others' code

This is the best answer here. You've come to the conclusion that you're good at coding alone, but you don't know how to do it well in a team or company— your team and company. Other answers frame this as a technology problem (patterns and practices) but you'll hack it faster as an acculturation task. Get mentors. Plural. Grab one person in each department where you feel shaky— QA's, solutions architects, operations, maybe product, etc. Tell them you're new at this and you want to ask them questions and work closely with them to get better. (This will not offend them and it will not make them look down on you. If it does, you don't want what they're selling anyway.) Two months into asking them for code reviews and just taking them to lunch and asking about things you know they care about in their areas of responsibility, you'll notice results in terms of your own thinking and output. 1 year in, you'll be very, very good at this.

Re: Ask HN: How to transition from academic programming to software engineering?

#44
My two cents: you don't need to read anything at this point, you need to apprentice. Go work somewhere where there are experienced developers. Spend your first weeks there sussing out who is highly respected among your coworkers and choose one or more of those people that you click with. Then just brazenly copy all their techniques and opinions for awhile. Pretty soon you'll find yourself disagreeing with some of what they're doing or thinking. That's natural, but you should resist the urge for awhile; some of that stuff comes from hard-won experience that is hard to explain. Eventually you'll start going your own way more and more. Sometimes that will blow up in your face, and that will give you your own hard-won experiences. Before you know it, you'll be one of the highly respected engineers that the newbies are cribbing from.

Re: Ask HN: How to transition from academic programming to software engineering?

#45

Thanks everyone, the comments are much appreciated. Here's a list of books and other media resources recommended so far in the thread: Robert C. Martin, Clean code: https://www.amazon.com/Clean-Code-Handbook-Software-Craftsma... Vaughn Vernon, various: https://vaughnvernon.co/?page_id=168 Steve McConnell, Code Complete: https://www.amazon.com/Code-Complete-Practical-Handbook-Cons... 2 Clean coder: https://cleancoders…

There are a lot of good recommendations here, and I certainly relate to the instinct to go to books when you're looking to level up a skill set, but I really think what you need is not a bunch of books to read, but a few people to watch do the work. The only real way to do that is to get a job alongside them. You can read the books at the same time; you can ask your new coworkers which recommendations they agree with and read those ones first.

Re: Ask HN: How to transition from academic programming to software engineering?

#46
To quote another great academic, Ray Stantz: "I've worked in the private sector. They expect results."

Just remember that the business world is going to expect results driven by their current business needs, not by solving interesting problems. So you want the shortest path that'll get you from here to there, which means bone up on the libraries or frameworks that are germane to your company's needs. Learn what your company's coding standards are from developers who are in the know, and apply them to your code.

Also, might I suggest finding a company that's at least tangentially related to what you did your Ph.D. in. That doctorate is going to look great, and your expertise is going to be super valuable, giving you a much-needed opportunity to strengthen yourself in the areas of industrial development where you are weak on the job, while still contributing value.

Re: Ask HN: How to transition from academic programming to software engineering?

#47

Earlier quoted context omitted.

I would also add that lots of new people waste more time doing TDD wrong than they would save doing TDD right. There are lots of things you only really understand until you've done them wrong.

Yeah, a lot of software engineering schools of thought are just based on superstition, but they're all somewhere in the neighbourhood of "productive practices" regardless of how different they are from each other. If you do * 100% pairing, * buttloads of unit tests, * lots of microservices, * use an autoformatter, * in a Node codebase, to order-of-magnitude approximations you're probably going to be about as effectiv…

When programs are simple, usually time to write code is dominated by finding the requirements. As programs become more complex, the time to write code becomes more and more dominated by understanding and working with the existing code.

In code bases you have written yourself, often you remember enough about it that you can mitigate the effects of complexity. Possibly you already had a plan for how to implement some functionality. Or maybe you know how to avoid certain problems.

As programs become more complex, you will find that "legacy team members" are disproportionately productive. Learning the code base becomes more important than learning the problem domain.

Teams that expend effort on maintaining a status quo where the exploring the problem domain dominates the cost of development (even with new developers), will usually lag behind teams that do not. Mostly, because it is difficult to do.

Some of the practices you mention can be used to help in this, but for a "legacy team member" it might not be attractive. If you have a more typical situation, knowing the code base better means you are much more productive and therefore more valuable. This secures a senior position on the team. Turnover is usually high, so most people leave before it gets to the point where even "legacy team members" become unproductive. When you go to a new shop, you can always complain about the "crappy" code and suggest a complete rewrite (at which point, you secure your senior status again).

While your list does not necessarily comprise what I think of a "productive practices", I think it is incorrect to imply that "productive practices" can not have a profound impact on the outcome of a project. The productive practices that work best for each team will likely be different. It's important to pick practices that work for your team and produce code that is simple to read and extend. Not thinking about it is a good way to ensure that you will end up with a complex system.

Re: Ask HN: How to transition from academic programming to software engineering?

#48
post #41

Some general advice I've given multiple junior developers over the years, you probably aren't a junior but most likely applicable to the advice you are seeking. These were passed down to me by other developers. Other HN folk will have links to literature but hopefully my advice will give you a precursor. * testing - write your functions small enough to be readable, but not so small their abstractions are meaningless…

I couldn't agree more with you about nesting loops. It seems clever at the moment when you're writing but when you have to come back after a while or worse, another developer has to, it becomes a nightmare. I would also go a bit further and put nesting if statements. Sometimes it's really required but other times nesting can be avoided. I try to avoid nesting as much as possible.

Quick tip: extract the contents of loops out into functions. That allows you to test the function outside of the context of the loop. It makes it easy to test boundary conditions and other exceptions. Often it is unnecessary to actually test the loop.

This is also true of branches. If you have an if statement (or other branch), consider extracting the contents of each half out. It allows you to test each half independently. If you have nested branches, you need to have 2^n tests (where n is the number of nested branches). If you extract the contents, then you need 2n tests.

This is one of the reason for unit rather than integration tests: you can dramatically reduce the number of tests while still getting full test coverage. Of course the downside is decomposing the structure of the code more than you might be used to. It's always a judgement call.

Re: Ask HN: How to transition from academic programming to software engineering?

#49
post #15

Your coworkers are your best resource. - Ask them to review your code and suggest changes - Look for questions of taste and ask more. It may feel intuitive to them, but if you dig in you can often find a good reason/principle behind it. - Read your coworkers' code - Read the comments people leave on others' code

This is the best answer here. You've come to the conclusion that you're good at coding alone, but you don't know how to do it well in a team or company— your team and company. Other answers frame this as a technology problem (patterns and practices) but you'll hack it faster as an acculturation task. Get mentors. Plural. Grab one person in each department where you feel shaky— QA's, solutions architects, operations,…

I was in the same boat as the op. Dove in head first into a software engineering role. Ended up working with the only true 10x'er I have known to this day. Nothing improves you faster than getting feedback from someone like that.

Re: Ask HN: How to transition from academic programming to software engineering?

#50
I made this move (and back): treat the goal of software engineering like another topic to do a lit search on, map out the domain, implement a few papers, etc. Instead of journals, you’ve stackoverflow, coworkers, Google.. I got out-coded more times than I can count, but as a PhD you can catch up quickly by treating it as a domain and problem to analyze and solve.

For Python, the built in docs are already very good, but I use devdocs.io a lot.

Post reply on HN