You are not logged in.

#1 2020-02-01 18:28:50

newbiehere
Member
Registered: 2020-01-29
Posts: 5

How do you go from intermediate to advanced in programming?

I have dabbeled in lots of programming languages such as JS, Java, C, C++, PHP, etc. I have created over 20+ websites using different technologies and styles (login, forum, rich text editor, etc) and in non web-dev way I have created Minecraft mods (in my early days), flash card programs. My most advanced program must be a "Word" clone in C++ using Qt where I can enter text and it gets saved in a MySQL server automatically. It is much more efficient than Word and have identical features. Anyhow, I have finally decided to try to go from being able to create decent web apps and random programs to actually be able to produce something I can get paid for or be extremely proud to put on my resume/CV/etc. How do I go from

1) I want to create this program! (2) 3 months later and lots of dirty fixes from stack exchange or inefficient solutions that I might be able to "fix" but it will take some 3 weeks extra (3) final, decent looking product

to "advanced" which I define as

(1) I want to create this project (2) I know which technology (e.g. C++ is better / Python is good enough, Vue.js is better than React for this, etc) is most apt for the program (3) lots and lots of time (4) Final product, with little to no ugly quick fixes

Is it just confidence in your product?

Basically what I am asking for is, how do I (1) become an advanced programmer and (2) how do I know when I have crossed that line? What are some things an advanced, work ready, programmer have done or can do that non-advanced programmers (unable to create a comercial grade program) cannot do?

Offline

#2 2020-02-03 16:21:03

priorit
Member
Registered: 2008-12-23
Posts: 18

Re: How do you go from intermediate to advanced in programming?

I will bite. (Just posted a question myself, and might as well try to answer another one).

"Advanced programmer" is something very dependent on your environment. Your skill is generally compared to your coworkers.
That said, here are my expectations for advanced programmers, and how I think developers can reach them.

1. have a good understanding of algorithms.
  Knowing how sort algorithms work isn't necessary a skill you will need often. (Most of the time there are libraries that contain them). However, a good algorithmic skill usually translates to clear, structured thinking.
  If you want to improve in this area, I liked the book "Introduction to algorithms" (Cormen, Leiserson, Rivest, Stein).

2. have a good understanding of how computers work.
  I expect advanced programmers to know about heaps, stacks, ... I want to be able to have a discussion about different garbage-collection strategies, etc. with advanced programmers.
  I really liked "Computer Architecture: A quantitative approach" (Hennessy, Patterson).

3. write maintainable code.
  This is something that probably comes mostly from experience. Once you have written your 5th compiler, you remember patterns that worked, and patterns that didn't. Advanced (and skilled) programmers have an easier time making changes to their program. Often, this is due to better abstractions, but also (and importantly) because of well written tests.
  If you want to improve in this area:
  - Read the "Design Patterns" book (Gang of four). However, avoid overusing it! Most people I know (including myself) tended to use them everywhere, even if that actually made things more complicated.

I have worked for Google, and during interviews, I mostly focused on 1 and 2. These are things that we could (partially) evaluate in the 40 minutes we had. I do think, though, that (3) is very important as well.

Answering your question more precisely:
- knowing which technology to use, is dependent on your skill set (and the one of your coworkers). There is rarely a "best" solution. You probably want to take time to experiment with different technologies to get familiar with them, but if you have experience with one framework, don't discount that. Obviously, there are times, when some technology just becomes too old and too cumbersome, but at that point your experiments with new technology probably made you already prepare for a switch at that point.
- "lots and lots of time": things aren't that easy smile
  I would say that this is where the "experience" part comes into play: you get better at structuring your program in a way that is easier to change.
  Personally I recommend to start with something that runs, and then improve it over time. You will need to refactor your program multiple times. If you prepared for this, it will be much easier. For example, if you can trust your tests, then changing your code is much easier. At that point, you will also see which of your comments help and which are missing. If you go back to code you wrote 2 months ago, and you needed 2 hours to understand it again, you need to update it (more comments, better structure, ...), and you hopefully learned something.
  Frequent refactoring is probably the reason, many programmers tend to recommend typed languages. Refactorings of programs in typed languages are often faster, because the compiler can help you more. However, you should know both (typed and untyped) and recognize their strengths.
- "little to no ugly quick fixes": if you have enough time, then this should be easy: whenever you see something that isn't right (or where you aren't really sure), just fix it before releasing the final product.
  Generally, we don't have infinite time, though. As such, you need to write hacks in such a way that they don't come back haunting you.
  * Assert unhandled conditions. If your code isn't really complete, make sure the program crashes/logs, when it encounters one of these cases.
  * Prepare for rewrites of ugly code. As long as your abstractions are mostly ok, you can often live with hackish solutions for some time.

Offline

#3 2020-03-16 00:20:39

philotomy
Member
Registered: 2014-12-08
Posts: 19

Re: How do you go from intermediate to advanced in programming?

I'm a bit late to this, but I'd add "have knowledge of different programming paradigms."

By that, I mean that you should be familiar with different ways of thinking about and approaching a programming task, and which approach (or combination) might best fit the requirements. Some common paradigms include procedural, object-oriented, imperative, and functional. From the languages mentioned in the original post, I'd say you're comfortable with object oriented and imperative programming, but perhaps less familiar with functional approaches. You might look into a functional language. For example, as an alternative to JavaScript for a web app, take a look at Elm. If you want to dive into the deep end of the functional pool, learn Haskell. There are also many "multi-paradigm" languages where you can explore functional programming, but you might need some discipline to avoid the imperative options/habits when using those languages. Some of those include F#, OCaml, Clojure, Scala, or even Kotlin. Be aware that some multi-paradigm languages are more "functional" than others. For example, tail-call optimization is highly desirable for a functional approach, and not all languages/compilers support it. Automatic currying is also highly desirable.

I focused on functional languages there, but it's just because you already are likely to be familiar with other approaches and ways of thinking. The idea isn't that one approach is always better, it's that understanding the different ways of thinking about a program (and the pros and cons of different approaches) will make you a better programmer overall, in any language.


Tu ne cede malis sed contra audentior ito!

Offline

Board footer

Powered by FluxBB