When you feel like shit, you won't want to do anything.
When you lose your health, you won't be able to do anything.
(I've been a professional programmer out of college for over 30 years and I feel like I'm still 25, doing my best work ever.)
I remember the exact moment in college I was made aware of the critical need to do this. I was eating a PB&J on white bread in our kitchen when one of my fraternity brothers (a jock and a health nut) saw me and yelled, "Save your life! Save your life!"
"What the hell are you talking about?" I asked him.
"Don't eat white bread. Read 'The Save Your Life Diet'"
So I read the book and have never looked back. I have read many other health related books since then, but it's not their contents that made the difference, it's the mindset I developed that has.
College is the time when this appears to make the least sense. You can eat or drink almost anything, go without exercise, and develop bad habits and still feel fine. But it really is the best time to lay the framework for a lifetime of good health. It's the time when you'll be able to experiment and learn the most about yourself and what works and what doesn't. And make no mistake about it: this is stuff you must learn and practice; it does not come naturally.
I have and I'm so glad that I did. I have watched so many of my contemporaries gain hundreds of pounds and accept a lifetime of ailments as inevitable, while gradually retiring to the sofa. It doesn't have to be this way! Learn how to take care of yourself now or all the "skills" in the world won't matter when you most need them in the future.
- Learn how to eat.
- Establish your best lifetime exercise habits.
- Learn what to avoid (or accept in small doses).
- Adopt a healthy mindset.
- Learn to embrace fresh air & water & good sleep
- Most of all, do all of the above no matter what anyone else says or does.
The most successful, happy people are those who can manage themselves properly.
And as for the basics of happiness, it's very simple:
- have some autonomy over what you work on
- have a social group of friends you spend time with
- eat well
- meditate or do cognitive therapy
- spend time in nature
I try to do something from every piece every day. Finding a balance and forcing myself to do a piece from each has helped me prevent burnout for over 9 months now, and has made me happier than ever.
Taking care of yourself is 50% lifestyle and 50% luck, and unfortunately that split shifts unfavorably with every passing year. Ailments are inevitable, no matter what you eat, or how much exercise you do.
While some things are definitely out of your control - you may get hit by a drunk driver tomorrow and be incapacitated, for example - your lifestyle can protect you from a lot of the randomness out there. I would say the percentage in the Western world is more like 95% to 5% . You mention ailments, but ever since I started exercising and eating right several years ago, I haven't gotten sick at all beyond some headaches here and there, and one instance of food poisoning. Before that happened, I would catch cold on a regular basis because my immune system was weak.
Now, this would probably be different if we were living in, say, Congo, where the environment is a lot more chaotic and individuals have a lot less control over their own well-being.
I'm not really sure if you can take a class that will teach you this skill. Socializing at parties is actually a great way to work on this skill--try to meet new people and see how quickly you can figure out where they're coming from. Working on group projects is also a great way to build this skill. As a freshman or sophomore you'll usually be the one getting assignments and as a junior or senior you'll be handing them out, and when you see both sides of the coin in a similar setting you can really develop an appreciation for what good communication looks like.
1. The ability to spot trends ahead of time, understand people's problems, and come up with solutions. In other words, the ability to figure out which types of skills will be valuable.
2. Deep knowledge in one or more areas, such as programming, Math, etc.
For example, due to (1) I was able to figure out that Machine Learning was a valuable and growing area, pick up a book, and get into the field. Today Data Science is still a great field, but the bar to break in is higher than it was 3 years ago.
My areas of deep knowledge are Math and Psychology. My deep knowledge in Math made it very easy to pick up Machine Learning/Statistics when the time was right. There were other related trends I could have followed (e.g. learning Hadoop, learning NLP) but those would have been harder since I didn't have the right background.
In college, your friend should focus on building up the type of deep knowledge that will help him easily acquire related skills later on. Generally speaking, it's helpful to take high-level, general courses as opposed to courses that focus on the tool of the day. For example, a course on Algorithms is more useful than a course on Python.
As he advances, he should start paying more attention to industry trends. Eventually he'll get to the point where he can realistically understand the major problems in the industry, and quickly pick up the skills that let him solve those problems.
Basic statistics and probability. You hardly ever need to pull out a T-test or calculate the standard deviation, but knowing what they are and why you should expect runs of good luck and bad can help smooth out your life.
Sitting down and concentrating on a subject may not be a teachable skill, but it can be learned and practiced. Highly recommended. Similarly, general research skills are lifesavers. Most people think they have them. Most of those people are wrong. Again, there might not be formal classes (or there might be, if you have a Library Sciences department) but they can be learned.
I'd like to add one point here. Researching for a new tv model is a totally different beast as compared to researching something very technical in a field, (e.g.) the right mixture\* to optimize burn time vs thrust in a solid rocket motor in prograde to Venus.
It's fairly easy to find info about common and popular things because the target audience is the general public and they write in a very informal tone. And because of penetration, you'll find quite a lot of information and you just have to apply statistics/probabilities to what you read online to factor if you're going to buy that TV set or not.
On the other hand, specific data will be very hard to find. You may have to start searching for related topics like rockets and fuels before you try to find ratios. Even so, you may end up having to contact a professor or someone whose name you found on a related page. They may not know the answer, but they in turn will/may try to hook you up with the person who probably knows and this repeats. This takes time (atleast a few days if not weeks).
* You may need info for the fuel ratios for hobby, work, or academia.
From my small experience, even better than estimating something right, was having the humility not to trust blindly our own instincts.
Don't get me wrong, one has to listen to her own "guts" many times in a life, and that's a good thing. A better thing is learning to recognize when you screwed up, and getting yourself out of that situation before it is too late.
My variation of Greenspun's Tenth Rule is that Common Lisp contains a reimplementation of Scheme, with some added "features."
It is not required by the spec, presumably to ease compliance in simpler implementations, because Common Lisp provides other iteration constructs missing in Scheme (DO and LOOP) which were preferred over recursion in practice.
Edit: It appears that in some exotic cases CMUCL (and maybe SBCL) does not use constant space for tail-calls when it would interfere with the proper relationship with dynamic bindings.
My understanding of the historical reasoning is that DO and LOOP are preferred in practice because the conditions of iteration are specified in a more predictable location.
By your line of reasoning, one should not rely upon Typed Racket because the functionality is not guaranteed by Scheme or RxRS. Neither should one rely upon SBCL's ability to run circles around Racket; performance is not guaranteed by the Common Lisp standard.
This evaluation behavior is sometimes called tail-call optimization, but it’s not merely an “optimization” in Racket; it’s a guarantee about the way the code will run. More precisely, an expression in tail position with respect to another expression does not take extra computation space over the other expression.
And you're right -- typed racket is still in its growing stages. There are a lot of guarantees you don't have.
The ability to learn new skills quickly
In my previous life doing IT, I was the "go-to guy" almost entirely because I knew how to efficiently and effectively read man pages and use Google. Nowadays that may take the form of reading API specs or language docs.
The way to acquire that skill is simply to do it over and over again.
I would totally agree with you on this one because of my personal experience. I'm no CS guy, and nuking a VPS repeatedly (screwing up because typing a / instead of a ./ kind of errors) and installing a LAMP stack and CMS software has made me proficient even in the finer points of LAMP (like memory utilization of mysqld, or number of processes in PHP). Because of this, I am way more comfortable with linux as well.
You wouldn't believe, I've destroyed installations like no tomorrow. And even on the personal front, more often than not, I tend to screw up my hardware and then with a great incentive to try and make it work again I read man pages, google every possible stuff to get it fixed. This automatically results in me knowing EXACTLY what to do when someone's screwed their hardware and are terrified.
So, actually I think I should say, "Not afraid of breaking things, AND (most importantly) have determination to fix them up again."
I second "the ability to learn" -- but be more confident and bold (this is an extreme):
“After Andy dropped out of Emerson College in his sophomore year, the [siblings] reunited in Chicago, where they started a construction business, learning most of the skills on the job. They once built an elevator shaft without any plans or previous experience, having projected unquestionable confidence to the people who’d hired them—not an unuseful talent in the film business.”
You can see the enormity of the undertaking, and the brass buttons it takes to say that, yes, of course you can do something that you have no idea how to do. Sometimes filmmaking requires that kind of absurd confidence (but don’t do anything that might make people fall down several stories or anything)."
Wait, was this for a film set, or was this an actual elevator shaft that people will be using to zip up and down a building?
Because if it's the latter, I'm terrified.
All major construction like elevator shafts is always inspected . Since they are working on-site, the quality, speed, and scope of their (subcontractor) work is apparent and visible on a real-time basis. You have to know what you're doing - if you do not - worst case, you get someone injured/killed, best case, they fire you. Like the cliche goes - a contractor with shiny new tools isn't a contractor you hire. As for licensing, there are ways around licensing & bonding...
The point is they weren't just bluffing - they had supreme confidence they could do it. And did it. As someone who is scared to install a new faucet, who does that?
 They did the shaft in Chicago: http://www.sfm.illinois.gov/commercial/elevators/faq.aspx
If I could trade in all of my technical know-how for the same amount of people skills, I would in a heartbeat.
My major was architecture, and the design classes gave me a sense of organization and elegant problem solving that are useful even as I build web apps for a living.
My drafting classes were useless - thank god I taught my self to use a pirated copy of AutoCAD at the time.
My classes in concrete and steel used large books of tables to look things up, which I am pretty sure can be easily handled by computers nowadays.
Data Structures and Algorithms would be the only thing from a traditional comp sci program I would have benefited from, I think, but I've done quite a bit of self directed learning in those areas, and am not worse off for it.
If I had it to do over again, I would've skipped school and tried to apprentice myself to people working on cool things instead. But I love to educate myself, and learn wherever I am. Some people are better off being guided, and those at upper-tier schools will benefit 90% from the connection they make, and 10% from the classes.
I work as a bioinformatician in plant genomics. My background is in economics and political science, with a minor in statistics. Jumping into genomics without a background in biology seems impossible, but I learn fast, and programming and statistics are desperately needed. Biologists are typically terrible at statistics, and even worse at programming, so people with skills in these ares are desperately needed.
Approaching problems with a social science background is also useful. I was interested in quantitative comparative politics, where observational data is the only data, and one tackles it with advanced models that try to control for confounding variables. Modern-day biology is similar: there may be some randomized experimental design, but confounding is still everywhere. Surprisingly biologists, trained only in randomized designs, don't see it this way.
* computer architecture -- for understanding what's going on at a low level
* digital circuits -- for understanding the next level down
* physics -- yet another level down...
* all the various math -- shouldn't this be obvious?
* statistics -- take the course from the Math Department if possible; the courses offered to Liberal Arts & Business majors were watered down
* organizational behavior -- for understanding how humans interact in groups
* a foreign language or two (and don't just learn the language, learn about the culture) -- for an appreciation of how things work elsewhere
* a course in something you know nothing about that requires a lot of writing (I found this to be better than the actual "writing course") -- to learn how to research, organize your thoughts, and present information
Looking back nearly 15 years later, the courses I wish I had taken:
* more EE
* forestry & ecology (I own some land with a woodlot now...)
* compilers (it wasn't offered every year, and I had a scheduling conflict the last time it was available) -- though this isn't that hard to self-instruct as long as you have a solid footing in the basics
compilers are still extremely practical. I'm sure everyone has had a scenario where they had to tokenize lots of strings and turn it into something meaningful.
Also, if all goes well, it gives you good ammo to tell in job interviews.
I took an accounting class as an adult, and I wish I had taken it when I was younger. I don't look at my checkbook the same way, and while I haven't really done much with my businesses (record label, music publishing), I know how to keep my books.
I worked at a startup in 2011, and my boss was very forthcoming about the financial health of the company. At one meeting, he showed the staff a lot of positive numbers about income and growth year-over-year. I was the person to ask about debt because I learned that assets equals liabilities plus equity. (He didn't skirt the question, which is why I still admire him today.)
Even if this freshman ends up working for an international conglomerate, he or she will be able to look at the yearly business report and get a sense of what's going on.
If you are into math, here are the 100 most useful ideas and theorems in math according to me --
For example, I am considering adopting a kitten. Most people's impulse would be to call up one of their friends who have cats and ask them what it is like to own one. What I did instead when the thought occurred to me was going on Google and typing in "should I adopt a kitten?" Within an hour, I had all the necessary information to make an informed decision.
Same thing with troubleshooting pretty much any kind of issue, whether or not it is related to computers. My iPhone has an issue where it turns itself back on when I turn it off. Instead of taking it to an Apple store like most people, I Google'd it and within 5 minutes found out that it's caused by a hardware defect. Then I made a decision that I can live with it and don't want to go through the hassle of getting it replaced.
Some issues are harder to handle this way. For example, I slept for 12 hours straight once, and woke up with a bad headache. So I google'd "too much sleep headache" and found out that it might be caused by multiple reasons, from hormonal imbalances to dehydration. Next time I want to sleep for that long, I'll see if hydrating myself periodically will prevent the headache. There wasn't one definite answer, but I still learned something.
I started programming at the age of twelve. Here's what I think was most important:
- learning to search the web crazy efficiently
- reading classic blogs like Joel on Software
- reading classic books, such as Code Complete, Refactoring, Design Patterns
- learning to use functional programming primitives (map/reduce/fold);
- breaking the habit of abandoning small projects and finally shipping something, and maintaining it for some time;
- maintaining a horribly-written application so I will never repeat that guy's mistakes
- making all sorts of mistakes (permature optimization, premature generalization) so they would come and bite me later, making me more experienced
- having a lot of free time to play with programming: glad I started while still in school
But I realized the most important one was to find a community. If not for internet forums, I would never have learned programming. I started by reading a book about Visual Basic, heading to a local forum and trying to help newbies, while still being newbie myself. That's how I learned. I would absorb the forum culture, discover different tools and languages by participating in flame wars, and later explore them and write articles to help other people. I'd translate articles from English into my native language, learning new concepts along the way.
StackOverflow disrupted this forum culture and I kind of miss it, although I know it was never efficient.
It is a diverse field, though, so you have to filter it by what you're interested in or good at.
iOS... I am planning to learn a bit of iOS, but mostly as an auxiliary skill. I am often tasked with porting iOS apps, so it helps to be able to read the source code and understand how they're put together. And most contracts these days want apps built for both Android and iOS. I don't think you can be a deep expert on both systems, though, so I'd rather partner with someone for the iOS work, and focus on being Really Good at Android.
I do perceive iOS as a relatively mature technology, though. Somewhere between stagnant and contracting in importance. Android, on the other hand, is still finding new uses and growing rapidly.
Web development is, I think, a good long-term investment, even if I'm using it to build Android apps right now. iOS development is more like an enabling skill, that I'm not looking to invest a lot in, and don't see myself doing much with two or three years down the line.
The viewpoint might be a bit myopic -- I do reallyreallyreally like Android. I like to think it's based on the contracts requests and trends I see, though.
The other skill I'm making an active investment in is web backend stuff. I did some CGI back in the 90's, and that needs badly to be modernized; I get asked for backend work on apps a lot. I'm studying Rails at the moment, but I will probably have to hold my nose and pick up PHP at some point.
I recently asked a principal of a web design firm that does pretty good work how to learn HTML/jQuery/etc. And he actually recommended Code Academy. As somewhere to get started - to bootstrap your learning enough so you can do self-directed projects. Really, I think I am going to have to buy 5 or more of the top-recommended jQuery/CSS books just to get started (even if I don't read them).
For iOS to Android ports, I recommend usually just using the iOS app (if it exists) as a black-box reference model /specification for functionality. The Charles proxy server  usually figures out any gray areas in the server-side interaction. Having access to the iOS source code/understanding it isn't always necessary unless there is some kind of shared library being used (shrouded C/JNI). A lot of the more complicated iOS apps have lots of CoreData/KVO-type/massive 3rd party library dependency like RestKit infrastructure that isn't directly translatable.
The best thing about iOS v. Android is that usually iOS developers aren't Android developers (as you pointed out). And it still flabbergasts me that Android has won (75% and increasing market share worldwide).
However, personally I'm thinking of getting back into iOS - (Storyboards, GCD) by doing small, small projects. iOS is still a very marketable skill.
When it comes to being 'Really Good at Android', I think you will get there. Have you presented/taught Android yet? It does take someone who reallyreallyreally likes Android to make the app look good (xml layouts, arcane knowledge) and functional and smooth (no ANR). Do check out all of the Google I/O talks if you have not already. The hardest part about Android v. iOS is that the knowledge sharing isn't as open as it is in the iOS world.
Hope you can find someone to partner with. Usually our developers find other developers that they like to work with semi-organically - by just working on a number of other, larger projects and every once in a while, they gell with someone and either start apprenticing the developer (assuming they are still junior) or work with them as a peer.
Either way, it sounds like you are diversifying your skill set appropriately.
Finally, in case you get bored/need anything else to work on for 2013 - try to teach some aspects of coding to non-coders (especially those who might have the potential but not the understanding).
Don't forget to double your rates this year :)
Consider taking a look at http://safaribooksonline.com/. They don't have everything, but they usually have enough good stuff to cover picking up a new skill. I think my IQ would drop by about 30 points if I discontinued my subscription...
For iOS to Android ports, I recommend usually just using the iOS app (if it exists) as a black-box reference model
I generally do, and I couldn't live without a proxy (I use Fiddler 2). But for some things, you really need the source. Error dialogs, for example; it's hard to be sure, from testing, that you've found them all. Math formulas, input restrictions. And you'd be amazed how easy it is to miss whole screens in black box testing just because you never saw a particular button / made a particular gesture!
It's more than that, though. It's good to be aware of whether they're using a default UI control, or a library is doing something a particular way, but it's the only library they have, vs. if they've carefully hand-coded a custom component. It's easier to make the case for doing things an "Android Way" in the first scenario.
iOS is still a very marketable skill.
Very much so! A year and a half ago, I think nine out of ten projects I could bid on were iOS projects. Nowadays, most of them want an app built for both systems. I think that'll be true for the foreseeable future.
I do think Android is starting to go beyond mere mobile, though, and that's exciting. For example, on the front page right now is this: http://www.hardkernel.com/renewal_2011/products/prdt_info.ph... -- and it runs Android!
What'll they build with that? I haven't got a clue, but they're going to need Android programmers to do it. People are starting to use Android touch screens in non-mobile ways, too, and I've seen a contract or two for Android OS mods.
I expect there to be some technically-interesting, Android-only projects in a year or two, and I plan to be ready. :)
Have you presented/taught Android yet?
No, though perhaps I should. I keep meaning to make time to blog about my experiences as a developer, and somehow there's just always too much else to do. I need to be more involved with the community.
The hardest part about Android v. iOS is that the knowledge sharing isn't as open as it is in the iOS world.
The docs aren't as good, either. The javadocs are good at telling you what properties exist. The problem is that they'll list "android:alignBaseline" as an option, and when you click for documentation, it says, "Aligns the component's baseline." Sometimes I wish they had a big "Did Not Answer My Question" button that caused someone at google to be hit with a foam mallet. ;)
StackOverflow is a good source of information, but you want to already have some expertise to filter things. The solutions (being crowdsourced) sometimes are false, or sometimes they technically work but are bad advice.
More than once, I've had to go source-diving to figure out how a standard component or option worked. I'm thinking probably the next thing I need to do to "level up" in expertise is get good at reading the Android source. Maybe make some time to contribute to some of the auxiliary open source projects I use a lot, like Robotium or Jackson. Maybe start my own; I have a couple ideas for things that would make my workflow a lot easier.
Hope you can find someone to partner with.
Yeah, I think I have. We're looking to do a few joint projects together in 2013. We'll see how it goes. :)
Finally, in case you get bored/need anything else to work on for 2013 - try to teach some aspects of coding to non-coders
Yeah, I've been meaning to do something like that. When I have time to do side projects, I like to do educational apps for kids. I usually focus on math, but I've thought about doing some sort of programming app targeting young elementary school kids. I grew up on LOGO in elementary school and loved it.
Don't forget to double your rates this year
Man, I've doubled them twice in the last six months. Theoretically, I should be making more money. Practically, it's just been the opposite; I've been sick too much to do good work. Funny thing about freelancing . . . you don't get paid sick days. :(
The Software Engineering class was a great way to learn what happens when you have bad/no management.
Technical Writing and the "Job Application and Interviewing" classes might have been the most useful long-term, though.
It's amazing how many problems can be solved by RTFM.
I have been teaching middle school and high school math and science for 15 years. I have been asked all kinds of questions, high-level and low-level questions. I have been asked many questions that I could not answer; but I have been able to give every student a good idea how to start thinking about their question in a way that would lead them to a fundamentally correct answer.
Disclaimer: I was a physics major in college.
If you're looking for skills in life, mine is being able to let go. Especially at work.
If you work for someone else, you HAVE to remember that your work needs to satisfy someone else. So throw away your ego, and listen (and pay attention) to criticism. You should never be afraid to speak your mind and take a stance but at the end of the day, you need to be a team player.
Just keep getting back up. You'll probably win eventually. Probably.
2. I know how to sell. How to really do it under pressure.
3. I know when to stop and smell the flowers.
4. I can take apart/fix anything and put it back / fix it with no issues. From deep fryers to washing machines and back to motherboards. I can fix it.
The ability to take a step back and say to oneself, "why am I thinking this way? Is there a more fruitful approach?"
On a related note, preparing for screw ups. Learning to make mistakes, and to assume mistakes will happen.
2. As someone living in a developing country, learning to speak English opened the most doors