Can learning subjects such as abstract machines and formal languages make you a better programmer?
In conjunction with years of practice, I'd say yes.
An appreciation of the theory behind our field, whilst not necessary to start with, does help to put things in context sometimes.
Kindness,
Dan
Absolutely. Even if you do not know them, a programmer uses the concepts every day. Without knowing the theory behind them, a programmer does not fully understand the software he or she is writing.
I do not have a formal CS education and have suffered for it. It has taken years of work to catch up.
Undoubtedly! It provides a context, helps you understand the principles that transcend the whole of computing science and understand why things are done in specific ways.
I did a Computing Science degree and now that I'm working in the IT department of a large company the theory I learnt at University is invaluable.
However:
- Studying theory will not necessarily make you a good programmer
- You do not need to study formally to become a good programmer
Yes.
It teaches you to think in concept and helps when you try to learn new things, a new programming language, see other new concepts, etc.
Definitely.
Using just the two very simple examples you listed, for example, I've used both concepts within the last couple of weeks in the office. I've created a state machine to reflect a specific workflow desired by the customer, and I've used regular expressions, the theory of which and capabilities of which are described via formal language theory.
Yes - it can make you a better programmer, but it is not a guarantee.
Understanding the fundamentals of programming, whether formal languages, abstract machines, network trees or Computational Theory (like big O notation) helps you to be aware of the diferent complexities that a programmer have to deal with, and gives you an insight into the types of trade-offs that you may encounter in future.
Theory alone however won't make you a good programmer - there are fundamental programmer principles like assignment, recursion and pointers without which you will be unlikely to ever be a good programmer. (Don't knock assignment by the way - it is shocking how many people making a living from programming actually don't truly get it).
Would knowledge of mechanical engineering make you a better driver? How about a knowledge of car mechanics?
There are different levels of understanding. It's possible to produce working programs without that theoretic underpinning. However I on occasions the deeper understanding comes in to play.
I reckon that the curious, widely read, programmer will tend to be better equipped to produce good code.
Now, if I only understood one programming language and had no CS background - where would by time be best spent in doing some reading or some study? Interesting question. I'm not sure that my first stop would be to study Turing machines.
Any additional theory will make you a better developer, I think.
New knowledge allow you to make your mind moe flexible, broader look not only at the world around us, but also on your own tasks.
Well, to be honest, I think the answer is like the answer for many things in life: "It depends."
I think that having a thorough knowledge of computer science theory can provide a great deal of knowledge to make you a better educated programmer (notice I did not say a better programmer). Being better educated has the potential to make you a better programmer, but not necessarily. In my opinion, there is a big difference between being smart and being wise. I've heard of others in my profession who take designs and abstraction to the "N th" degree, just so their programs would be flexible enough to handle anything. Yet they are taking a year to build programs that could have been done with simple logic in a month. Many of us would look at it and write that off as nonsense vs common sense. But how many of us fall prey to such behavior......
I didn't have a "formal" CS training in school. The school I went to only offered a Computer Information Systems curicullum. So we learned programming basics, but very little theory. And I've turned out to be a decent programmer. Sometimes I wish I had more training, but for the type of programming we do in my IT department, I really don't need more theory. Just keeing in touch with the latest best practices articles and books is enough. Maybe reading up on design patterns, or enterprise architecture. But no need to get into more detailed algorithms. Overall, I think experience counts for more than anything.
So I think in everything there is a balance. What do you want to accomplish out of life? If you need to understand theory based on where you want to be, then you need to study it. But if you aren't going to need theory, but only a basic understanding of programming, then that is all you need. Not that you can't benefit from theory, but the point being that what you experience is more likely to shape you into a better programmer. Guess that's just my two cents.
Truly understanding the where and why's of any computer science theory definately makes you a better programmer. There is a big difference between studying/learning and understanding though.
Just knowing that there is an algorithm A that solves something similar to case B may even be harmful, because it is an easy way out to a possibly horrible solution to the problem at hand if you don't know how and when to use it. I have seen so many bad examples of this, people not understanding what something does and just apply it because someone said it was good for something similar at some lecture.
However if you really understand the solution, you would also know how to adjust it to your current problem at hand, or realise that it is not a proper solution at all to your specific problem.