Niccolo Machiavelli is known to many as the Italian political scientist who justified the means by considering the ends, and advocating for a ruthless extermination of the opposition by a ruler of nation. However, there are several sides to Machiavelli's work that extend in all sorts of other directions applicable to a wide array of events in our society. For example, we have the following quote:

"And in truth the prince who seeks for worldly glory should desire to be the ruler of a corrupt city; not that, like Cæsar, he may destroy it, but that, like Romulus, he may restore it; since man cannot hope for, nor Heaven offer any better opportunity of fame."

What is Machiavelli saying here? In short, he is saying that in order for a ruler to gain fame and wealth, he should not simply attach himself to the most prosperous nation, but, rather, should work towards improving the state of a corrupt and decrepit one, because it offers an opportunity for achievement as well as a position as one who brought prosperity. This brings admiration of the people (which entails well-being of a ruler, as Machiavelli later argues), as well as individual economic prosperity. The same circumstances are not provided for those who seek to rule a prosperous nation - expectations are high, the people are attached to and invested in the current state of affairs (as well as the current ruler), making achievement and recognition difficult.

How does any of this relate to startups? Almost certainly, Machiavelli most likely had nothing of the sort in mind. Shift, for a moment, the focus of the quote, from nations to specific industries or sections within the startup world. Consider, for example, project management software. The world knows that we just have too many generalized project management SaaS companies and that there's a atleast a few good ones (e.g. Basecamp) and a lot (e.g. 6,232 signups per week w/ paid plans) of people are already using and seem to be pretty happy with them. So, we may consider the "project management software" industry to be something of a "prosperous nation", in Machiavelli's terms. The customers (translates to: citizens) have high expectations, are generally satisfied and will be extremely resistant to change.

Now, let's consider, as another example, the "industry" of online discussion board tools. phpBB, probably the reigning champion, is badly designed, terrible to look at, annoying to install and bothersome to maintain. It is in a "corrupt" state of affairs. Citizens (read: customers) are dissatisfied and would do well to find a new, modern solution - maybe even pay for one! Things have changed in the world outside of discussion forums, and phpBB now feels like the most antiquated portion of any well-run website. To gain the support of the citizens should be much easier: expectations are low, they are generally dissatisfied and will welcome change with open arms.

The comparison is clear. If you are going to try to pick an "industry" that is already populated with lots of good companies and the customers are generally pretty satisfied for your next startup, you will have a difficult time getting people to convert. Instead, if you pick an area where everyone is complaining and is annoyed with the service, you can quickly get large numbers of customers by simply producing a better product. This is what 37Signals has been trying to preach for quite a bit of time. But, really, the underlying idea has been with us since (and probably before) the 16th century.

I decided that it would be a great use of my time to read more research papers in computer science and mathematics.

I've never really done much in this direction, and I generally expected that I would be able to freely read what all these smart people have been working on.

It hadn't even begun to cross my mind that in fact research papers are sold, which means that for a typical paper, one can expect to pay $\$10-\$15$ each. Or, you can get a journal subscription. Initially, this doesn't seem like much, but, when you are trying to get a general idea of a field (i.e. skimming through lots of papers, concentrating on a few) it doesn't make much sense.

Of course, the expectation seems to be is that the university library has a subscription to the given journal, thus, the scientists may have the research papers for free. But, this assumes that anyone that is interested in research at all must be part of a university or some sort of technical library that stocks computer science journals.

This seems unbelievably counterproductive to me. I understand that scientists are just as human as the rest of us and need a paycheck (the larger the better), but isn't there a better way to do this than charge for research papers? It seems to be discouraging the flow of information in an environment where the information flow is the primary commodity.

In the 1500's, solving polynomials was all the rage. So, there were obviously a bunch of mathematicians in Europe pursuing it, e.g. Cardano and Bombelli. The most funny thing was that these men never shared their results with one another, they simply continued work in secrecy and challenged each other. This obviously seems rather odd to us now, right?

In reality, that's exactly the direction we're pushing to by charging for research papers (obviously not the same degree)!

Through incentives, we are discouraging researchers from sharing ideas and learning about new ones.

Not only this, charging for papers limits "outside" (i.e. not part of a university/academia) participation in science, which also seems rather weird, as though research was some old country club with limited admission.

I'm not really sure what to do about this problem, if its been solved already, or, how many misunderstandings I have about the system, but, if what I'm seeing is actually happening, we need to fix it.

I had a friend recently talk to me about selecting between software engineering and computer science as a major. He hadn't done too well in his Calculus class in high school, and the software engineering major didn't require as much math, so, he was leaning towards it.

As evidence, he stated that he would probably never use math again in his life as a developer so it doesn't make any sense for him to learn so much of it.

While I understand his sentiments against math (hey, I'm no good at history classes), the idea that the skills you learn in math are never useful is simply not true.

Math (not high school math, math taught at top tier universities with good professors) is a subject which tests your ability to work on multiple levels of abstraction at once and also learn how to tackle problems that seem too difficult at first.

When you're working on a difficult problem set, more often than not, you'll be considering concepts both at the bottom and the top of the "conceptual hierarchy" (a bit like high-level and low-level languages).

This is similar to how we want Rails developers to know atleast some stuff about how Rails works internally, because without that understanding it becomes very difficult to solve many problems you encounter as a developer.

What separates good programmers from excellent ones is not how many languages they know or whether they can recite PEP-8 start to finish. It is their ability to solve problems which sets them apart.

Math is excellent training for this type of thinking. Regardless of whether or not you ever use Gaussian elimination or vector spaces ever again in your life, those four hours you spent on that problem set probably made you a much better problem-solver, and quite possibly a better developer.

There's thousands of kids in countries like India and China that want to become engineers for reasons like "it pays well", "my cousin moved to the States and he was an engineer" and, "my parents told me to".

They go through all of the intense testing and hours of studying in order to become engineers when they finally face the harsh reality. Very, very few of these engineers are "wildly successful" (i.e. moving to the United States). Most of them work jobs in their home countries, with just-better-than-average wages.

All of us in the States probably feel the talent crunch in the Valley; why can't we just ship over that excess of engineers from India or something? Well, we're trying.

There are excellent people from these countries, no doubt (Vinod Khosla, anyone?). But, the issue is, they're very difficult to find. The issue is there's just far too many that are in software solely because they've wanted to earn more money.

Earning more money is definitely a valid reason, but, it should never become the only reason. When that happens, you get drones that try to maximize profit with minimal work. I won't name any names, but, we've all seen the "outsource your work" websites with the marquees, excessive gradients and a note that says "best viewed on Internet Explorer 6".

So, there's an incredible lack of passion, even though they are, on paper, lots of hackers available. If you don't have passion, it is very difficult to be motivated to build something that is awesome and something that people want to use.

I think that passion is one of the defining characteristics of great hackers. They are legitimately interested in what they are doing and this allows them to go above and beyond in terms of results. I'm not suggesting that developers should be screened on the sole principle of how passionate they are, but, I think its something that we too often neglect to take into account.

There's been this sentiment on HN and r/programming that computer science that is taught in universities is completely impractical and useless in the "real world" and is completely different from programming done in the workplace. I don't think that's the entire story.

A lot of people that read this blog are web developers. They're web developers in the sense that they write some portion of a website that directly deals with the user. Its either frontend (interacting with the user) or backend (answering the user's requests), but, the idea is the same; you're writing code that directly connects with your users. And, of course, there's a ton of people who write native apps for mobile devices. Again, there's a similar idea; you're developing software that directly deals with the user.

These people very rarely refer to things like the efficiency of a linked list over a doubly linked one or maybe how semantic analysis is performed in compilers. And, that's completely fine.

But, trouble starts when you've started to write code that doesn't in fact deal with the user directly. Maybe you want to bring a few SQL calls together before committing to the database to reduce hard drive seeking; that's not directly related to the user, but, its extremely important. At that point, you're going to need to know algorithms and how the scale. You will have to understand how filesystem implementations differ on certain issues.

For example, when I was first starting out with programming, I didn't really understand the difference between a linked list and array. I thought, hey, who cares, one extends and the other doesn't. Well, it matters. A lot.

Linked lists are pretty bad at indexing; $O(n)$ worst case, whereas an array is $O(1)$. Of course, you don't really notice this difference most of the time. But, I was writing a server that was supposed to process about 6 gigabytes of data per day (for financial markets), and I had made a rather stupid error.

I had a buffer that was storing some data that would be flipped to disk every time the buffer filled. I knew the size of the buffer, but, I thought "hey, why not just use a linked list, so, in case there's some kind of error, I won't get a buffer overflow". So, without understanding the theory behind the common abstractions we use, it gets rather difficult to write code that is fast.

Of course, things like finite automata aren't exactly the most practical, but, they still add an element of understanding, which is important.