|
I really want to improve at programming but I feel I'm kinda of stuck
in this 'expert beginner' phase. I'm familiar with basic data structures
and their complexity (linked lists, arrays, hash tables, queues,
trees), some basic theory (DFA, NFA, CFGs, TMs, lambda calculus etc),
and elementary math (calc I, II, III, linear algebra, ODEs, discrete). I don't feel particularly confident in any of these areas of study,
knowing the minimum amount to get me by. Sure I know what a NFA is,
but ask me convert it to a DFA and I'm lost.
I lack 'deep', real knowledge and am desperate to acquire this
mythical stuff before it's too late. In terms of areas of interest, I am interested in type theory, FP,
compilers, machine learning, expert systems and AI. So knowing this, how would I best use say 8-12 hours a day, every day,
to learn this stuff? Should I be reading papers all day? Should I be
writing code? Should I be doing exercises in books? There's just so
much material I need to get through that I am lost on how to actually
spend my time getting better. |
Your list of interests sounds like that of a computer scientist, but I'm allocating a little space to "Maybe your only exposure to computer programming so far has been undergrad CS and you're describing it in the only language anyone has ever taught you."
The best way to skill up as a programmer, if you're interested in that, is to ship more software. There is deep, mythical knowledge in programming, and it is acquired with sweat on your brow and a pickaxe in your hand chipping away at a coal face made out of Why Doesn't This Freaking Work.
You will note that most programs you work on build on things you have heard about in CS classes but do not implicate most of them directly. Compilers are very nice to understand. If you want to be a programmer, absent you making the goal of working on compilers your life's work for the next 10 years, you will probably not work on compilers. Most coal faces sound like something rather more like "A business has some fairly straightforward transformations to be made on two sets of data. There's plenty of opportunity for smart implementation choices and cleverness, but that mostly informs the small rather than the large of this project." (Cleverness in the large in programming is good selection of which coal faces to attack at all. After you get there people often stop calling you a programmer no matter how much programming you do.)