Ask HN: What a 2nd tier college student must do to be at par with the best?
I'm passionate about solving problems and making things, especially AI and game development. But due to some bad decisions I ended up dropping two years after high school and could not get into the IITs i.e. the top colleges in India. Ever since I started college and found the sub-par level of CS education here, I have tried to take my education into my own hands. I'm an autodidact by choice and here is the strategy that I have followed for the past one and half years at college:
- MOOC : I have studied all the important CS courses from popular MOOCs like CS50, MIT OCW, etc. I have earned a certification in an AI MOOC taught by the IITs and completed the Machine Learning course from Coursera too.
- Projects : I have done some good projects and open sourced them at https://github.com/AmanDaVinci
- Others : I have worked as a two man team to publish a game on Play Store and we also sell our plugins, tools and assets on Unity3D asset store. I have organized and instructed successful game development workshops as I plan to start a Game Dev club in our college.
Considering the experience and expertise of the HN crowd in the engineering field, what more could I do to be at par with the top students of the world?
1) Should I invest in AI / ML nano degree certificates?
2) Should I work more on real software projects like open source AI and games?
3) Can I do anything else to improve myself?
69 comments
[ 655 ms ] story [ 2009 ms ] threadI envy you actually; I never had a head for higher math and programming, my talents lie in hardware hacking and electronics repair. I'd love to learn some proper CS, but my life took a different track before college and now when I try to learn anything beyond bash scripting or simple microcontroller stuff in C, my mind turns to mush.
I hesitate to give you advice since it sounds to me like you're pretty busy already.
Also, what do you mean by "at par"? Status? Money? Knowledge? Expertise in a given area, and if so, what?
And by "at par", I meant the same opportunities that a top school student gets.
Becoming a good software engineer seems to come from working with people with good taste (on real projects). In my experience I haven't met anyone who learned to be a good SE from university (it may be possible, but I doubt it would happen at a mediocre university).
Colleges rarely teach you what you need to know professionally - they can't, tech moves too fast. Instead, they teach you how to learn what you need to know. This is an important distinction because it should inform your approach to your professional growth.
1. Stay passionate both about software and your own growth/education in it.
2. Start some personal projects and, important, work on them until they reach a place where you can talk about what you learned, the techs you used and be able to at least show a page or two of it working.
3. Be forthcoming in interviews about your desire to create. The longer i am in software the more importance i put on hiring creative people.
Finally, think of software development as modern day blacksmithing. Those who do well have a few things in common: passion, persistence and a great set of artisans (mentors) to learn under. Prioritize finding some people who have compelling opinions on software development and work with them. It will change how you build software and the value you will bring to teams in the future.
And the mentor aspect is what I'm missing right now. So, I have planned to contribute to open source and/or apply to GSOC '17.
Any other ideas how to find suitable mentors?
I'm sure others will have better advice than i do about finding mentors. In my case my first CTO out of school was a major impact. I should also say that mentors may not be above you, but peers. Even in college i became close friends with other developers who, collectively, influenced one another with our learnings and opinions. A rising tide raises all ships, as it were.
That's B.S. that lazy college professors use who have their heads so stuck in academia that they don't take the time to keep up with technology. Technology stacks don't change that fast in the enterprise that they couldn't do a better job of preparing students and teaching them how to hit the ground running at a company.
During the beginning of 2013, for standard enterprise development, Java and .Net along with Bootstrap and Jquery were popular - they still are used today.
Back in 2013, the databases that were used in the enterprise are still popular today. iPhone and Android were the most popular mobile platforms.
Sure keeping up with the latest front end framework may not be easy to teach, but courses in JavaScript, CSS, etc would still be enough.
1. Focus on becoming a good programmer (ie, SPOJ/Topcoder/Directi). That'll help you clear interviews, and get good at thinking about algos and data structures. I'd even prioritize this over other CS fundamentals.
2. Keep your GPA up and get into a good grad school. I disliked both the interview process and the classism (ie, recruit from top schools) of Indian companies when I interviewed there.
3. If you don't want to go to grad school, make sure you don't touch TCS/CTS/Wipro/<insert mass VIT employer here> with a 100-foot-long- pole. Given your passion, and assuming you use the next two years to become a strong programmer, you will find a good place to work in Bangalore. You might have to pay your dues, but please don't pay them at the above mentioned places.
And people who look at you as second class undergrads can fuck off (esp the professors at IIT Madras :) ). I know several friends at IITs that preferred to pot-smoke-away their time there. If you're near Chennai I'm happy to chat with you.
And yeah, it would be great to chat. Here is my mail: aman@amandavinci.me Or, you can go to my website for social media contacts: http://amandavinci.me/
If you are sure you do not want to go to grad school (which is very difficult to decide at this point) focus more on projects. Try to get an internship at a good startup and prepare for interviews hard (read DSA). Going to a top employer like Google, MS, Directi will help you get over the second-grade brand. All of these care more about DSA instead of all projects and specialized knowledge in ML and AI. I know preparing for interviews is boring compared to doing projects but take this advice seriously if you want to get hired at one of the places I listed.
They have a well regarded neurophysiology lab that was run by Marcus Devanandan. Perhaps you could do research / collaborate with them.
And yeah, I'm currently looking for internships and such for the summer. But the credentials card always comes in play.
1. The level of programming taught in Indian universities is not enough. Writing a sort program is quite different from writing good, maintainable OOP code. Apart from working in a good company, one way to develop this skill (which I feel is critical) is to look and contribute to good open source projects - elasticsearch, spark, etc. Unfortunately I don't know of any good books which teach this overall, apart from specific aspects like Effective Java.
2. Another aspect that I feel is missing in Indian universities is challenging assignments. I would have liked to write my own toy OS to learn systems, or toy kafka to learn distributed systems. The more core computer science fundamentals you master now (preferably through writing code along with learning theory), the better an engineer you will be later.
3. Another aspect that is lacking is the way to reason through things. Indian universities have a third-person approach on the lines of "the experts do things this way so we will just do it this way", on the contrary in a US university the reasoning is more on the lines of "we use to do X, that had Y limitations. So we moved on to Z, now your assignment is to design an extension to Z (say Z+) which solves YY limitation". Unfortunately, I don't know what can be done to improve the way we reason about things.
4. Don't forget to explore different areas. I started with computer graphics, moved on to compilers, then app development, then data engineering, then infrastructure development, then back to data engineering.
Go and work somewhere where your university's reputation is unknown, then people will rate you on your work rather than the university you went to.
1. Build a strong CS and Math background, especially since you are interested in AI, ML. Academia is the best place to do this. Look at the curriculum of top engineering schools like mit, cmu for your sophomore year and see how you can complement it with the courses you are taking. This will pay you dividends in future. You are already doing that, which is great! Try to add more structure to your execution.
2. Take advanced courses on the topics you are interested as you get to your senior year. A lot of MOOC’s have entry level courses but lack on advanced topics. You will find these scattered across university lecture videos, you already mentioned OCW.
3. For prototype projects try building things from the ground up. For e.g. Taking an Operating systems course great, build a simple filesystem from scratch. It will help you in understanding the complexity involved in production grade software and why certain design choices are made.
4. For the projects that you are passionate about deep dive into it, its great to see people talk about their projects with deep technical insight, pros and cons of design choices made etc.
5. Personally I would avoid learning every new language that comes up, focus more on programming language concepts (there is a course of Coursera on this) and learn few languages well.
6. For internships look for startups that are working on interesting ideas.
7. More than the certificates the projects what you did in those courses are more valuable.
8. Enjoy, make good friends, stay healthy and active.
For internships, I believe start ups are the best bet to gain experience and maybe gain a mentor for life.
You want the people you know (and who know you) to have their idea of you intertwined with what you want to be doing; now, everything they encounter that has to do with that will get funneled your way.
I am going to go off on sort of a tangent and offer you some general advice:
1. Do not worry about what other people think. You mentioned in the beginning of your question about being looked as "second class undergrads", and that is completely false. As Rainer Maria Rilke once noted: "Your life is so inexpressibly your own..."
2. Build things you are passionate about, and not because they'll help you land a job but just for the sake of building things. If you are interested in artificial intelligence or machine learning, learn about them and build something. Better yet, keep a blog and write about the process of learning about AI, ML, etc. Don't be afraid to email some people you look up in the industry for guidance.
3. Keep learning, learn about anything that sparks your interest. Nothing is boring in its deepest essence. There's always something to learn. And if you know a lot, teach it or write about i.e. set up a repository for other people to learn more about it in an easier way.
Above all: Just be you. Don't label or attach yourself with certain identities. Build great things just for the enjoyment of building things. Love the process of building things. Collaborate with friends and colleagues. Go boldly.
Learning, building, etc. is all a joy. Don't try to be the best _____, just build stuff that matters to you.
And I'm gonna follow your advice and blog about my learning experiences. Infact, there are valuable gems of advice here and I'm thinking to compile them together in a blog post for many other curious students like me.
You are already on right track. Just complete the Graduation as it is required by many companies(and visas if you need any in future). Go for fundamental courses more on MIT OCW and others. I also studied in a private engineering college from India(2010-2014). My rant at the time here: https://nainomics.blogspot.in/2011/11/welcome-to-indias-high...
I just focused on my learning. Some professors were encouraging. That helped.
One anecdote: I made a heroku style PaaS for my final year project(like dokku). My professors couldn't understand what it does and why is it even necessary. Their main point was we have "shared-hosting" services to do these(I had to go from php to java/python example then :P). Now after two years they have their industry peers saying docker all over and have called me several times regarding that.
I am now Backend Dev building APIs with Python(Django) and Elixir at a small company. I also have small Open source contributions under my belt. Contact me if you need someone to talk to
But things are much simpler than that. Programmers solve problems and even the most revered programmers are just solving other programmers' problems. If you are building stuff, irrespective of size, scale or complexity, you're on the right track. Snub the anxiousness of not studying in the top-tier college; it won't matter few years down the line. I certainly can relate to zealousness of solving complex problems, but in my view, it's certainly not a prerequisite for personal fulfilment, or success, for that matter.
In day-to-day work, I am yet to use anything related to AI but every now and then, I find immensely time-saving project that just solved an insignificant problem.
1. Apply to startups. If you are looking to apply to the big four, make sure you do your diligence and work hard at coding contests. 2. Practice peer-teaching. VIT is a huge college. There are more people like you, and you can easily help each other by doing projects together. 3. The industry, in general, rewards freshers who have worked in large teams and projects before. 4. Make sure you get a good internship. Shouldn't be hard for you, but if you are interested, drop me a mail (Razorpay, Bangalore) 5. Go for depth first and then pick your specialization within software. For me it was Web Development and Software Security. Could be anything for you, but make sure you have tested the waters in other fields before picking one. The one benefit of College Life is that you have time to experiment and fail. You can try out projects in all these different fields, and then decide what you are really passionate about. 6. GSoC is a great option. I'd recommend trying for a experienced org over a new one. 7. Avoid freelancing, unless absolutely necessary. It rewards short term gains, over long time learning. You can make much more money cloning WordPress themes and reusing them across projects then learning a new programming language. The latter would help you much more.
I'm very interested in Software Education in India, and if would like to talk more, drop me a mail (email in profile).
And regarding software education, I believe MOOC is going to play a very big role in the near future especially in countries like India where hard working and deserving students lack quality world class education.
And given the Indian affinity for certificates and credentials, I believe this could be a great start up idea too.
This has served me well as a guide, however it doesn't apply neatly to all areas. Invest in Skills, not Credentials.
Look - since you are passionate about solving problems and making things, why don't you just create sources of passive income or build some business from the ground up? This way you will be able to bypass any reputation issues that your university has and focus on your creativity instead.
I feel like this is good advice to some people, but it also requires a business skill-set / interest, which is not everyone's cup of tea.
All that matters is your passion and how much you put into the work you do.
One thing is to just learn the subjects and get as good a grade as possible. Even if a class is subpar, just learn the subject. I had to submit an assignment once about process scheduling in Linux etc. After ten minutes study, I knew I had an A+ on the assignment already. But I had always wanted to look into that topic any how, so I spent several more hours reading about it for myself. I always wanted to learn about scheduling, and if I punted on it then, when would I ever study it? If I did that all the time my skill level would be high.
If you study and get good grades and have a good relationship with professors (go to office hours and schmooze a little, pay attention and participate in class and be prepared and listen), you can always apply for a Masters at IIT or elsewhere. So you can still get that name if you want it.
If the subject is theory of computation and the teacher is sub-par, just go above and beyond. Learn about big-O and the squeeze theorem and pushdown automata for the class, but for yourself as well. Read (some of, all of) a non-assigned book on automata theory if necessary.
Insofar as projects, one thing I suggest is doing projects related to coursework. Toward the end, or right after a class on C++ - write your own C++ program, or fix an issue with a Github hosted C++ program and send a pull request. If it is a graphics class on OpenGL, write your own program in OpenGL towards the end or right after the class - maybe explore iOS/Android OpenGL ES. Or look at scikit-learn after an AI class. Ground some of the theory you learn in class with application.
Your classes covering concurrency and threading and critical sections and mutual exclusion may seem boring in school, but if you're a programmer you will run into these things and you will be happy you learned how to deal with it properly a few years back, even if you haveto go back and read up on it. The AI stuff may sound exciting, but getting all these details right together is what will get you to be a good programmer.
From what you wrote, my main advice is don't be too all over the place. If you have a class in databases and a class in Java, that semester, spend a lot of time learning about the theory, and maybe a little time in application setting up MySQL on your desktop and writing a Java program to populate kt. It's OK to have one other side project going at a time of something that interests you, but you should be spending a lot of time learning about databases and Java.
If you have time on your hands, just dive more into it. For example, in the USA, a drink may be 2.5 liters. In some countries that is 2,5 liters (comma, not period). I once submitted a patch to a Java project doing a switch/case by country. The upstream told me the Java had a DecimalFormat class that already did that. My method was a waste of time, and also less complete. It was something about Java I nad not learned. You're just scratching the surface in class, there's a lot of ground to these subjects.
So get a good grasp of each subject you study. Meanwhile, if you have an interest or specialty you'd like to pursue, do that as well.
What I really care about when I interview you is how you answer my questions (this doesn't mean that I expect you to be able to answer every question fully), how well I can gauge the depth of your knowledge, and whether or not I think you will listen to senior engineers, learn what you need to do quickly and with an appropriate level of mentorship, and be a team member rather than someone trying to do his/her own thing.
Ok, I'll admit that someone who went to a for-profit school is going to have a higher bar to pass, but I haven't had to worry about that yet.
I think someone who has worked in Microsoft - who might not have contributed much - minor bug fixes compared to the guy who has a worked in a startup - build products from scratch and all that in an extensive deadline - staying up entire nights on a new few occasions to make the release date ends up getting a straight reject.