Comment on: (Brian Will) Object-Oriented Programming is Garbage: 3800 SLOC example
0 22 Mar 2016 17:42 u/nice_tie in v/programmingComment on: (Brian Will) Object-Oriented Programming is Garbage: 3800 SLOC example
I use vim as a primary development environment both locally and remotely. With exuberant ctags, NerdTree, and YouCompleteMe, you can get the most useful elements of modern IDEs on almost any *nix system.
Comment on: (Brian Will) Object-Oriented Programming is Garbage: 3800 SLOC example
Every time I see these videos, it's always arguments about the verbose nature of OO code, code that's only used in one place being inefficient, etc. And every time, these projects are dissected as if they were in a complete vacuum. He appears to be going for larger projects now due to previous criticisms that he's tackling over-simplified examples. Despite his obvious coding talents, his analyses show someone who doesn't work on large numbers of similar and/or recurring projects, and someone who doesn't work well on a team.
Procedural code for large projects can be a nightmare to maintain with a team, it takes longer to onboard new team members, and it is more difficult to document in a comprehensible fashion. There's a reason that enterprise code is more generally OO. In the long run, in large teams, and on large projects, OO code saves time and money.
Comment on: I Want to Start Programming. Where Should I Start?
Your current laptop should be fine for programming. I'll echo others here in saying that you only need a beastly machine if you're going to do high end graphics or tasks that are very computation heavy. As for developer tools:
PHPStorm - PHP - Most PHP developers I know use this (if they use an IDE at all) or something similar and have good things to say. PHP is a good starting language as it's not so unforgiving as C++ or Java and allows you to focus more on the foundational knowledge. When you've got a reasonable feel for boolean logic, program control flow, and data structures, add in a strongly typed language like C++ or Java.
IDLE - Python - I know some people that use this, and they say it's good enough. Most Python developers I know use Vim and Emacs, so take this recommendation with a grain of salt. Python is a clear and easy to use language that can, like PHP, help you get a grasp on basic programming foundations before moving on to more complicated things.
Eclipse - Java - Eclipse was made for Java. I've used it quite a bit, and as far as IDEs go, it's got a lot of functionality. It's not always easy to use, but it's got everything you should need for learning programming right out of the box.
Xcode - C++ (and others) - I've only heard about this from second and third hand sources, but it's a fairly standard IDE for Mac users to use when developing C++/Objective C applications. It also comes highly recommended on StackOverflow.
You're on the right track starting at codecademy. You can also try codekata for daily practice once you get into a language. If you're feeling competitive, there is also codefights.com. There are also great courses at udacity, coursera, and udemy.
Once you feel like you have a grasp of programming basics, go for these books:
Code Complete - Steve McConnell (Coder's bible of best practices) Design Patterns: Elements of Reusable Object-Oriented Software - Erich Gamma, John Vlissides, Ralph Johnson, and Richard Helm (Common use cases programmers run across and good solutions for addressing them) The Mythical Man-Month - Fred Brooks (About software engineering process more than programming itself, but definitely worth a read) The Art of Computer Programming - Donald Knuth (More advanced book about algorithms. Read as soon as you can understand thing. Don't be too afraid of the assembly. :))
If any of this missed the mark or just isn't what you're looking for, let me know more about what you know and what you want, and I'd be happy to provide more.
Comment on: Do you need an advanced degree to work with "cooler" things like AI and Machine Learning?
Yes, stats! They're extremely important for machine learning and AI as well. I erroneously omitted states because it's on the easier end of the math difficulty scale and was more obviously useful (kind of like algebra), somewhat contrary to the list provided in my previous comment. Stats generally provide a base that's used as part of more complex calculations like in Kalman/Particle Filtering, error/confidence computation, randomized optimization, and Bayesian learning. I'd also like to add that ML/AI is not just difficult..it's awesome.
Comment on: Do you need an advanced degree to work with "cooler" things like AI and Machine Learning?
Most importantly, how are your math skills? If you want to work in advanced algorithms, be prepared to use that calc 4, advanced set theory, linear algebra, and all the other things for which you weren't sure you'd find a use.
As for your question, it really depends on what you want to do. If you just want to do basic machine learning, it's fairly easy to pick up R or Scikit-Learn and start entering Kaggle competitions. If you want to work on the cutting edge of machine learning and artificial intelligence, you typically need significant contributions to the field, an advanced degree, or (preferably) both. Fortunately, the OMSCS program at Georgia Tech is pretty cheap (~$6k - $7k total) and is surprisingly rigorous.
Comment on: Is having a Documentation Manager a good idea?
I have a process that generally works well for a small team (~15 people). I have the programmers do this for API docs when they develop new or modify existing functionality. If they don't add/modify a doc block that can be generated properly, their pull request doesn't make it through code review. User documentation is a separate process that generally involves the UI/UX team, the QA/UA team, and select members of the dev team to compile everything and make a nice, pretty, digestible PDF.
Comment on: Where should I migrate my projects to (from Github)?
Definitely BitBucket. I moved over from GitHub a little over a year ago and I haven't looked back. Atlassian development tools are pretty awesome. It also integrates really well with HipChat, Jira, Bamboo, Confluence, etc., if you're interested in that sort of thing.
You do bring up some valid arguments. I'm definitely not saying that you should always follow OO practices all the time for all purposes. Blindly following ANY ideology all the time is generally a bad idea.
In your first bullet point, I'd recommend strongly against picking one of the two original objects to handle interactions in most cases. While adding a bridge object can be a little verbose at times, it preserves reusability. You could also extend one of the original objects and add the code for interaction there if it makes sense, which would ensure that you're following SOLID.
I'm not sure I see the issue with your second bullet point. Object1.object2.object3.method() should work if the method is publicly available. If it's protected, then it adding getters for the functionality you need shouldn't be a huge task and would only need minimal testing, assuming you had already written tests for the internal objects. Am I missing some other use case here?
If I have code that works, I don't rewrite it just because there's a 'better' design. The only time I'll rewrite working, bug-free code is if I'm creating new functionality that may use old functionality that's not general enough, or if I have to copy and paste it too much, creating a maintainability issue. If there is a need to generalize, abstract, or refactor code, I'll do it. Otherwise, rewriting for the sake of purity and perfection is an exercise in futility.
Your final point just seems like a development problem--not because of bad programming, but just because the original developer didn't see future use cases and performance issues that may pop up later. This isn't limited to OO. @rwbj makes a good point as well in that you can extend the object and override things that don't make sense for your case.