Ask HN: How to best acquire theoretical computer science knowledge? - <AUTHOR> I didn't know what I wanted to do before going to college at Penn State. I just knew that I had to go to college.  I was always interested computers so I ended majoring in Information Sciences and Technology.  About halfway through when I actually got to take some programming classes I discovered that I had a passion for software.  I went to my counselor and inquired about switching over to CS.  Unfortunately, almost nothing from my major would transfer and I had to pretty much start over.  As someone paying for college myself this really wasn't an option.  I continued on with IST in the Design and Development option.
I ended becoming the first employee at Bay Area startup.  They were a bit desperate and I convinced them I could make their Android apps.  I did and they are both highly rated.  I also made one of my own that ended up getting featured on Google Play and receiving a lot of press.  I have a bit of knack for it but I am so bored with GUIs and UIs.  I want to work on harder problems and not just use other peoples libraries.  The problem is that my lack of knowledge limits my thinking.  I want to fix this.  I am torn between going back to school for another BS in CS, pursuing a MS in CS, or teaching myself from things like MIT Open Courseware and Udacity.
I am not really worried about getting a job.  This is about gaining knowledge.  Although having a "real" CS would certainly help keep me from being pigeon holed as an app developer and open a few more doors.  I do think that going back to school would be the quickest route to gaining the knowledge I want.  I am just worried that I wouldn't get into a top school and I don't know if I should try to do a BS, MS, or just take classes.  I really don't want another $50k in debt either.  Especially when things like the Georgia Tech online MS CS is coming out for $7k.
So, what is the best way for a proven and largely self taught developer to take their knowledge to the next level? <comment><USER3> There is an alternative approach that inadvertently worked for me that may work well for you, particularly if your goal is to learn things beyond a conventional computer science curriculum. I have been working in high-end theoretical computer science for many years, with significant advances to my credit, but I went to school for chemical engineering. People are often curious as to how I acquired so much esoteric domain expertise in theoretical computer science without spending any time in a computer science class.

Pick an interesting "hard" problem in computer science and attempt to solve it. This works best if either there are no published solutions (e.g. massively parallelizing ad hoc graph search) or the solution space varies widely under the possible parameters (e.g. the design of a unique high-performance database kernel). Iterate, be creative, search the literature for interesting ideas that you can borrow from, and evaluate new designs you come up with. If something does not work, understand how and why and try to fix it. Wash, rinse, repeat.

This sounds like a lot of work, and it is, but there are three unique upsides. First, the challenge of it can be quite a bit of fun in its own right and there is a clear goal of what you are trying to achieve which helps keep you motivated and measures progress. Second, you will cover more of the phase space and explore some tangential theoretical areas while hunting for solutions to narrow sub-problems that you would never be exposed to in a more structured setting. Third, you will invariably explore some unusual or unorthodox ideas that you simply would not be exposed to in a directed, formal program. From the standpoint of being an effective theoretical computer scientist, it will help you develop a unique perspective of the problem space that is different than the perspective that arises from more structured programs.

Also, you might actually solve one of the unsolved theoretical computer science problems you have as your challenge in addition to developing a deep understanding of the surrounding problem space. That happened to me (and then replicated later once I realized it was possible) and it would never happen if I was simply taking courses on the subject matter.

This was an effective way for me to gain in-depth understanding of a diverse range of theoretical computer science areas on an informal basis. One of the downsides is that your rote knowledge will not perfectly overlap what is taught in CS curricula even though what you do know will likely be more valuable (e.g. in spatial indexing some CS courses teach priority trees even though they have no memorable theoretical value).

<comment><USER4> _Pick an interesting "hard" problem in computer science and attempt to solve it. This works best if either there are no published solutions (e.g. massively parallelizing ad hoc graph search) or the solution space varies widely under the possible parameters (e.g. the design of a unique high-performance database kernel). Iterate, be creative, search the literature for interesting ideas that you can borrow from, and evaluate new designs you come up with. If something does not work, understand how and why and try to fix it. Wash, rinse, repeat._

How do you verify your attempted solutions and talk to other researchers? I've always found it hard enough getting a hold of my own advisor or someone else in our department, let alone someone at an official research institution if I weren't in one.

<comment><USER3> That part has always proven to be pretty easy. For most interesting problem areas of theoretical computer science, there is rarely more than a handful of deep experts. Anyone else you talk to would likely need to invest a lot of effort understanding the nuances of the theoretical problem before they could have an informed opinion, which they aren't going to do. Identify the few real experts on the topic and talk to them.

These individuals have two useful characteristics. First, they can identify 99% of non-solutions immediately upon casual inspection. Second, if you show them something novel in their area of expertise that they cannot immediately dismiss, it piques their interest and they will invest the time to actually understand what you've done. I've never run into a case where I developed a novel algorithm or similar where the other experts working in the field were not happy to study it if I sent them a cold email.

However, a big part of the learning experience is being able to show that a particular algorithm must have a desired set of characteristics solely by its description before you show it to another expert. The unique skill you are learning by doing things this way is how to take an arbitrary set of complex behavioral constraints and designing an algorithm or system that conforms to those constraints. This is very different than the more orthodox course approach where you learn the constraints within which a given set of well- known algorithms exist and then select the appropriate algorithm for a use case. There are many real-world cases where all well-known algorithms cannot fit within the necessary constraints. Designing custom algorithms is not particularly difficult, but it requires grokking all the theoretical knobs that can be turned for a problem space rather than memorizing variants of a particular solutions.

</comment></comment></comment><comment><USER5> This is the core of a CS degree, each one is class, sometimes multiple classes that go into more detail. All interview questions will basically only cover these topics.

1\. Algorithms & Data Structures <\- The biggest one

2\. Baremetal Hardware. ASM, goes into the design of a physical cpu with ALUs, etc. Sometimes you make your own basic CPU. I suggest using a course with ARM ASM, simpler than x86 ASM.

3\. Operating Systems & Multithreading Theory. You usually do a bunch of C language work here. Maybe combine it with a project on an ardunio or similar.

4\. Discrete Mathematics

5\. Databases

6\. (Optional) Compilers. Write your own compiler, do this after the ASM course.

7\. (Optional) Artificial Intelligence. Learn cool things such as machine learning. AI can be very statistical at times, so I suggest adding a Statistics & Probability course to supplement. Statistics is used a lot in business, so it's useful to know for life in general.

8\. (Optional) Computer Graphics, using OpenGL!

On top of that I suggest you learn a functional language like Clojure or Haskell. Or both of them. Also learn a language where you have to do memory management and deal with pointers (like C, C++, Objective-C) if you don't include it in your Operating Systems course. After that you can basically do anything in software. Any new language and platform will be just covering concepts you already understand at that point, so you'll be able to learn them extremely quickly.

<comment><USER6> I would add computability and complexity theory to that list. Some computational complexity should be covered in algorithms and data structures, but theory of computation is not really (as algorithms by definition solves only computable problems). A fundamental knowledge of what is and what isn't computable is quite important in theoretical computer science IMO.

<comment><USER7> I can't remember if formal languages and automata was an elective or a requirement for me... I think it might have been required. The textbook was the one by Sipser, and I thought it was a pretty good book.

</comment></comment></comment><comment><USER8> _So, what is the best way for a proven and largely self taught developer to take their knowledge to the next level?_

It depends on how you learn. Some people will recommend Coursera et al., which are great. I tried some Coursera courses, but found that I found the pace too slow and became bored quickly.

For me, reading always works the best, since I can adjust it to my pace. You could look up a curriculum (as someone else suggests) and compose a reading list from that. Also, there are some works where you really can't go wrong. Some examples:

\- Structure and Interpretation of Computer Programs, Abelson and Sussman

\- Algorithms, Sedgewick, Wayne

\- Introduction to Automata Theory, Languages, and Computation, Hopcroft, Motwani, Ullman

Lesser known, but incredibly fun books:

\- Purely Functional Data Structures, Chris Okasaki

\- The Reasoned Schemer, Friedman, Byrd, Kiselyov (or a good Prolog book).

After learning the foundations, you could branch out to a subfield that interests you.

(Or as Frank Zappa has bluntly put it: _"If you want to get laid, go to college. If you want an education, go to the library."_ )

<comment><USER9> >It depends on how you learn. Some people will recommend Coursera et al., which are great. I tried some Coursera courses, but found that I found the pace too slow and became bored quickly.

You can watch the lectures at 2x speed. ;)

<comment><USER10> Yeah, but you can't jump to the next lesson - unless you wait until the end of the course and see them all at the time, but then you won't get a certificate because you miss the quiz deadlines.

<comment><USER11> One thing I've noticed with Coursera is that if you join before the course starts, there's often a preview button that seems to show at least the entire course's video lectures. If the content was useful enough to you, you could take the time to download all the videos and could watch them at any pace, and since you'd always be ahead because of your quicker pace you could still do the quizzes, albeit not straight after watching the lectures.

<comment><USER12> You can download the video, and then you can extract the audio and listen to the mp3 wherever you are, as often as you want. At least, that's what I did.

I don't think the OP is in it for the certificates.

</comment></comment></comment></comment></comment><comment><USER13> The other responses are great. But one meta point I think is worth making. Don't overestimate how much competency you gain from just getting a CS degree. Lots of people coasted their way through undergrad without internalizing a heck of a lot. The fact that you are motivated to go out and get knowledge puts you, IMO, at a great advantage.

My background: I did a BS in CS/Economics but spent most of my time playing online poker and skipping class. I managed to get a job I love on mostly potential, and I've had a great time re-learning all the stuff I was superficially exposed to but didn't work that hard at.

The most important thing is caring about what you do and taking ownership over your own development.

<comment><AUTHOR> This is why I am considering the BS. I already had the college experience at Penn State. Meaning parties, friends, girls, football, etc. This time it would be purely about going to class and learning. I bet I wouldn't even have to do Gen Eds since I already have a BS.

<comment><USER14> I think the marginal benefit of a second BS-level degree is small given the cost in time and money.

If you're going back to school then you should definitely consider an MS. Maybe you're worried that you wouldn't be accepted or that it would be too challenging? In that case, narrow down a list of universities/departments where you would like to enroll, and identify what you need to study in order to get accepted.

Alternatively, teach yourself, and try to join a top tech company that focus on making the kind of software you're interested in. Working with great programmers has a large impact on your learning. Perhaps you're underestimating this impact because your first job wasn't challenging enough.

</comment></comment></comment><comment><USER15> I'm going to keep this reply shallow but my advice is dig up a curriculum and course guide for a CS degree (there are many publicly discoverable with Google), establish what all of the main topics and threads are, grab the best/most recommended textbooks for a couple of topics at a time, work through the books a few pages at a time and for anything you don't understand, Google and learn about it. Take copious notes as you go to refer back to. Read papers that pop up from time to time, get a feel for what you know you _don 't_ understand and quickly get up to speed with them (even if it's just reading Wikipedia for 20 minutes).

The above is deliberate practice and learning but also keep an eye out for CS- level posts linked on HN and [http://www.reddit.com/r/compsci](http://www.reddit.com/r/compsci) and relate them to what you're learning. Read a post about AI data structures in Prolog? Don't understand Prolog that sounds interesting? Get a feel for what Prolog is. Write a simple program. Get a feel for implementing the data structure in a language you _do_ understand. Then try and bring both Prolog and the structure together. Rinse and repeat with anything that interests you. Again, be sure to TAKE NOTES or you'll forget things using this scattershot approach.

It'll take a TON of time but if you keep your sessions relatively short, you'll get a shallow knowledge of all of the major CS areas quickly, and then you can use your job or natural interest to drive you into going deep on areas that affect or motivate you.

I'm starting an MSc in software engineering later this year but my own CS knowledge has mostly been learned in the above ways (that is, I don't have a bachelors in CS).

 _Clarification: As cliveowen got me to realize (below), the above approach might not be for you if you have a very specific target in your career development. My experiences and recommendations are specifically around getting a broad level of experience rather than aiming at a specific role (which, perhaps, you should be doing)._

<comment><USER16> Frankly I think that's the worst advice you could give anyone for whatever subject: i.e. "when you find something you don't know about, study it". The best course would be to pursue a targeted learning, and by that I mean, do you wanna be a data scientist? Then you should study probability theory and statistics along with the relative algorithms instead of reading something about Prolog. Do you wanna become a software engineer? Then you should study software engineering, programming, algorithms, advanced algorithms and data structures, patterns, and so on. Getting a "shallow knowledge of all of the major CS areas quickly" with a "scattershot approach" is a recipe for disaster. The ultimate goal is to gain skills needed for your dream job.

<comment><USER15> I concede it's not the best approach if someone has a specific goal like, as you suggest, becoming a "data scientist", a "compiler developer", or a quant, etc.

In my case (and what I _felt_ was the case for the OP) a general, broad level of knowledge is paramount. I then study deeper on an as-needed basis off the back of my broad but shallow knowledge. Being able to tie together the basics of many unrelated areas really helps in my work, but is surely not for everyone. I already have my dream job for life so my goal is more on becoming well rounded rather than getting a specific job.

From a career POV, should the OP specifically focus on a specific target rather than just aim to get a general CS understanding? Quite possibly! But that's a different discussion/recommendation that I think you could kick off in your own response to OP. So I'm voting you up not because I agree with your criticism, but because perhaps the OP _does_ need to think more solidly about the end goal.

<comment><AUTHOR> The goal is simply acquire a much deeper understanding of computing that I feel I missed out on by not studying CS in college. I see myself as extremely employable doing app and web development for the immediate future. Under the hood everything is like magic to me and I don't want to feel like that. I also feel like I don't know enough to know what my dream job in computing is yet. Your thoughts are limited by your knowledge.

<comment><USER15> You might like to try the old "go down the stack" process as a first exercise then. There was a post about it recently on here. A Web app developer who knows a lot about things work right down to the metal is a lot more valuable than one who doesn't.

How do the processes behind your webapps work? Why or why can't your app support 10,000 clients hitting it at once? What's happening at the HTTP level? The TCP/IP level? Just understanding some of the algorithms behind routing and TCP congestion avoidance could give a ton of food for thought, still get you into learning algorithms, notation, and reading CS papers, but still be more directly beneficial to the day job. I wish you luck however you end up approaching it! :-) The only bit I want to repeat is take a lot of notes.. do blog posts, write articles.. anything to ensure you retain that knowledge because it's so easily lost as you get older.

<comment><AUTHOR> Taking notes has always been my weakest point as a student so that is something I will definitely have to focus on. I think it's sound advice though.

</comment></comment></comment></comment></comment></comment><comment><USER17> Doing a BS in CS would be the best, otherwise you will need a ton of self- discipline to learn even a half of what you would learn in a degree program. If you decide to self study, and have enough "mathematical maturity", you will find everything you need on MIT OpenCourseWare, they have all the core courses available online with video lectures, solved homeworks etc. I would start with going through those two first:

Structure And Interpretation Of Computer Programs:

[http://ocw.mit.edu/courses/electrical-engineering-and- comput...](http://ocw.mit.edu/courses/electrical-engineering-and-computer- science/6-001-structure-and-interpretation-of-computer-programs- spring-2005/video-lectures/)

Mathematics For Computer Science:

[http://ocw.mit.edu/courses/electrical-engineering-and- comput...](http://ocw.mit.edu/courses/electrical-engineering-and-computer- science/6-042j-mathematics-for-computer-science-fall-2010/video-lectures/)

The first one is pretty much a master class in software engineering, the other prepares you for studying algorithms, I would consider those the two main more theoretical facets of programming at a professional level. With that background you can try to work on their algorithms course:

[http://ocw.mit.edu/courses/electrical-engineering-and- comput...](http://ocw.mit.edu/courses/electrical-engineering-and-computer- science/6-006-introduction-to-algorithms-fall-2011/lecture-videos/)

It would also be very valuable to eventually take all the core mathematics subjects from OCW: Single+multivariable calculus, linear algebra and probability theory - the profit is less immediate but those things do come very useful. All those six courses on the MIT OCW are top notch.

<comment><USER18> It is hard to beat a good CS curriculum with real teachers, peers, assignments, tests and grades. These things don't work well for everyone, and the pressure can be pretty intense at times, but damnit that pressure can really burn stuff into your neurons that would otherwise go in one ear and out the other. The overlapping of topics and repetition of important concepts are also typically lacking in a self-learning environment, and these things really helped me to pick out what was important in terms of building blocks for more complex things. Coursera et al. are great, they fill a niche, just probably not what you are really looking for.

<comment><USER19> _It is hard to beat a good CS curriculum with real teachers, peers, assignments, tests and grades._

I dunno... I think it depends on the individual a bit. OK, to be fair, I did drop out before finishing my B.S., but up to where I was at, I can honestly say that I learned 90% or more of what I learned, outside of class, reading and practicing on my own. The only class I really remember the teacher's explanations helping a whole lot, was in certain parts of Discrete Math.

I could be wrong, but I feel like some people are just "wired' for teaching themselves stuff, learning from books and videos and websites, and then throwing the occasional question up on the Theoretical Computer Science Stack Exchange[1], or /r/askcomputerscience or whatever.

At the very least, I would posit that most people can learn an awful lot through self-study. Maybe not enough to do ground breaking research in C.S., but certainly enough to bump up their knowledge of the "basics" to where they aren't clueless when somebody else in the room starts talking about algorithmic complexity or finite state machines or whatever.

[1]: cstheory.stackexchange.com

[2]: [http://www.reddit.com/r/askcomputerscience](http://www.reddit.com/r/askcomputerscience)

</comment></comment></comment><comment><USER20> Read papers.

Read lots of papers. Start with easy ones to learn how to best digest highly academic technical writing then keep pushing.

CS is remarkable in how much of its academic knowledge is online, available, for free. Taking advantage of that resource is beyond key.

If you know roughly what you want to learn, search out a seminal paper in that area. If it's deep CS, you'll probably find a good one from the 80s. Seek out every citation that's proximal to a sentence in that paper that confuses or excites you. Search on Google Scholar for all the recent papers that cite the one you found and begin eating up the chain that direction. When you find a deep topic you want to learn more of—set theory, logic, formal languages, discrete math, matrix analysis, automata theory, geometry, topology, &c.—don't be afraid to look for a good book on the topic. There are resources around the internet answering "What's a good introductory book to X" for all kinds of X.

If you don't know the general area you're interested in then I recommend the exact same strategy but with greater emphasis on following citations that make connections to other areas of CS. Additionally, pick a few disjoint topics (Category theory, system architecture, graph theory) and follow them all simultaneously looking for connections.

Formal languages, automata, and process algebras form a really fundamental mathematical course of study that I'd highly recommend to anyone interested in "why" CS works. Optimization, matrix analysis/linear algebra, and diffeq form a great basis for simulation and machine learning.

Generally, for any of these routes, learn to find your boundary of knowledge. Studying source material is very challenging because any given paper will tend to assume many things about your background. Most of those assumptions will be false and lead to density of the paper. You can often power through without them, but you can also take it as an indication of a new place to study.

Finally, see if you can find a study group or journal club. I'm not there, so I don't have firsthand experience, but I'm sure there are many in the bay area.

(Oh, and if you read mathematical papers/books don't skip the proofs and exercises. That'd be like reading the iOS documentation without ever programming anything.)

<comment><USER21> In case you want to read papers but don't really know where to get started, here's my collection I've read over the years: [http://dl.dropboxusercontent.com/u/315/articles/index.html](http://dl.dropboxusercontent.com/u/315/articles/index.html) ... feel free to browse through it and pick up anything that looks interesting. You'll probably want to scroll all the way to the bottom and work your way up the list.

Many of the classics are in there, such as the Plan9 paper and Paxos Made Practical.

If the images are distracting, here's the list without them: [http://dl.dropboxusercontent.com/u/315/articles/index_no_ima...](http://dl.dropboxusercontent.com/u/315/articles/index_no_images.html)

Actually, looking over it, that list isn't very curated. Just Ctrl-F "unix" and that'll take you to some good papers.

<comment><USER22> Thanks for this. I actually like that it's not curated, it's a good way to discover things I didn't know about. The fluid simulation stuff looks especially interesting.

<comment><USER21> Sure, no problem. Let me know if you have any questions or want to chat about random compsci topics.

<comment><USER22> I'll probably have some questions after looking over some more of the papers. We seem to have a healthy intersection of common interests. What's the best way to get in touch?

<comment><USER21> Cool! You can mail me at sillysaurus2@gmail

What sort of projects are you interested in?

</comment></comment></comment></comment></comment></comment><comment><USER23> Theoretical computer science is probably not what you mean. Theoretical computer science are things like complexity theory (up to arithmetical hierarchy and randomized and approximation algorithms), theory of recursion (up to e.g. Gödel's theorems), (various kinds of) logic, algorithms and datastructures (full of hardcore probability and statistics), etc.

Subjects like that give you a firm grounding in the area of computer science but you could study them for ages especially on your own. These subjects are also not very practical in terms of everyday engineering and on top of that before you even get to that level, a top school would require you to study a bunch of mathematics to gain a certain level of rigor of your thinking. My guess is that this is hard to do on your own.

On the other hand, since you have a related degree already and since you know programming, I would heartily recommend you to study on your own combining two approaches: bottom-up to learn the basics and top-down to immediately start increasing your market value and to start opening doors and to keep yourself motivated to go forward with the more tedious study of the basics.

E.g. say you are interested in distributed systems - you can start reading up on them (top-down) while digressing here and there to learn some of the basics.

Make use of online resources like Coursera for the necessary basics (bottom- up): at least some maths heavy on proofs [1], at least some complexity theory, at least some graph theory, ....

I think a purely bottom-up approach (going to a university) could be a waste of time and money in your case. But you need to emulate it a bit because a purely top-down approach could be too superficial and wouldn't teach you some of the more rigorous thinking you might need.

Whatever you do and learn try to do it in-depth. Superficial knowledge of many things will not benefit you much in the long term while in-depth study of many computer science fields will likely lead you through a series of small enlightenments.

[1] My professor of linear algebra used to insist that we as computer scientists have to know all the proofs of the theorems we were learning - <USER2> contrast to mathematicians learning the same subject - simply because we have to know how things are done to the last detail and we have to develop that kind of thinking.

<comment><USER24> IamA graduate student in theoretical computer science.

I don't know that I agree with the poster above with respect to:

"a top school would require you to study a bunch of mathematics to gain a certain level of rigor of your thinking"

Most good schools require only two courses in "pure theory": first an introduction to discrete mathematics, where you learn about logic and how to prove stuff, a smattering of number theory/crypto, graph theory, probability, and automata theory; second an algorithms course that teaches you to analyse and construct algorithms according to certain design methods. Together this is really only a year of mathematics, and both courses are quite fun.

Note that discrete mathematics as taught by a good CS program is NOTHING like the math you learned in high school or elementary school, it teaches you to think creatively about mathematical structures and then justify that creativity with logic.

If you're already a developer, you'll probably have a bunch of latent structures hanging around in your brain that will let you have an easy/fun time with the material in these two courses. I suggest that you study discrete mathematics and algorithms in depth, to the level of some decent undergrad course on each. Learning this material will give your thinking the sort of quantitative/logical "edge" you might want -- these two courses contain the basic mathematical tools common to much of computer science. I do agree with the post above that they are not the most practical things in terms of everyday engineering, though.

Addendum: if you find that you really enjoy the mathematical angle and you think machine learning is cool, also learn linear algebra, because a bunch of machine learning theory and implementation relies on linear algebraic algorithms and concepts. Linear algebra actually would be practical to know if you ever do anything with data analysis.

<comment><USER25> I think your off base with this. A good school with a good theoretical cs program will always require up to multivariable calc, linear algebra, stats with calc, and discrete math. These are required because they will almost always be essential for doing theoretical work. Sometimes you just need it to properly express and explain complexity of a problem but many times in theoretical work knowledge of advanced mathematics is integral to to the actual research. Your advice is more geared towards what most good schools consider a general cs degree.

<comment><USER24> My advice is indeed geared towards general CS, it was unclear to me if the original poster wanted to get into heavy-duty theory or just gain a more rigorous understanding of CS in general.

Even at good schools (in the US, anyway) the calc up to multivar that is required isn't done with what I would call good proofs. They'll generally do epsilon-delta definitions of the limit and a few other fun things, but will fall far short of a truly rigorous development of the calculus. Same goes for many introductions to linear algebra and stats with calc courses. Some math departments use linear algebra to introduce proofs and creative mathematical thinking, though, so this isn't always the case.

So if someone is looking to develop how they think in mathematics and they already have a good programming background, they are much better served by taking a discrete math course than any of those sorts of math courses. If they then want to learn calculus, I would recommend self-study from Spivak's "Calculus" book which is a fun and elementary but rigorous treatment of the subject. You get to see not just _how_ calculus works, but _why_ it works, which is sorely lacking in most undergrad calc courses, even up to multivar.

<comment><USER25> What do you call good proofs? I think what you consider a "good school" is not what I consider a good school. In my calc classes we studied tons of awesome proofs that were very applicable to theoretical cs stuff. Plus most of my linear algebra classes and stats classes were just engineering, cs, and math majors so we once again focused on very useful real world applications and fields of active research.

If someone wants to develop their mathematical thinking and is good at programming descrete math isn't going to help them much because they have probably already seen much of it. They need to be exposed to high level calc and linear algebra to develop their mathematical thinking.

</comment></comment></comment></comment></comment><comment><USER26> Is it theoretical CS as in "CS topics that are more theoretical" (NLP? AI? Search engines? Software engineering?), or as in "Theoretical CS" (the mathematical subdisciplines: combinatorics, type theory, lambda calculus, etc.)?

In any case you first need to investigate what is interesting to you, free resources are far from rare and you can probably build yourself a decent curriculum from MIT OCW, Coursera, Udacity and similar websites which you can then study at your own pace with videos and books. If finding a job is not your concern I wouldn't advise putting yourself into debt. See [http://www.saylor.org/majors/computer- science/](http://www.saylor.org/majors/computer-science/) for an example of curriculum.

</comment><comment><USER27> If you're OK learning on your own, you might try buying a book before committing to the cost of tuition, also. If you really mean "theoretical CS" I don't think you can go wrong with Sipser. The latest edition[1] is expensive, but a used copy of the second edition [2] isn't TOO bad, considering the cost of another few years of education.

[1] [http://www.amazon.com/Introduction-Theory-Computation- Michae...](http://www.amazon.com/Introduction-Theory-Computation-Michael- Sipser/dp/113318779X)

[2] [http://www.amazon.com/Introduction-Theory-Computation- Michae...](http://www.amazon.com/Introduction-Theory-Computation-Michael- Sipser/dp/0534950973)

<comment><USER28> I second Sipser's book. Probably the best textbook I used in university. You can find international editions for a very low price.

<comment><USER29> International Editions:

[http://used.addall.com/SuperRare/submitRare.cgi?author=sipse...](http://used.addall.com/SuperRare/submitRare.cgi?author=sipser&title=Introduction+to+the+Theory+of+Computation&keyword=&isbn=&order=PRICE&ordering=ASC&binding=Any+Binding&min=&max=&exclude=&match=Y&dispCurr=USD&timeout=20&store=ABAA&store=Alibris&store=Abebooks&store=AbebooksAU&store=AbebooksDE&store=AbebooksFR&store=AbebooksUK&store=Amazon&store=AmazonCA&store=AmazonUK&store=AmazonDE&store=AmazonFR&store=Antiqbook&store=Biblio&store=BiblioUK&store=Bibliophile&store=Bibliopoly&store=Booksandcollectibles&store=ILAB&store=Half&store=LivreRareBook&store=Powells&store=Wbm&store=ZVAB)

</comment></comment></comment><comment><USER30> Read. Focus on foundational texts. I'm talking about texts like K&R, SICP, Lisp In Small Pieces, RFC 791. I'll add Gödel, Escher, Bach, because I genuinely believe it will make anyone a better computer programmer. There are far more than I could mention in a paragraph; L.I.S.P is not as well known as the others I mention, and got added mostly because I'm reading it at present. It's _really_ good.

Also, read actual code. Want to know how diff works? Read diff. Getting better at code forensics is the second-best way for a self-taught programmer to learn real CS.

EDIT: I am a largely self-taught programmer.

</comment><comment><USER31> My story is somewhat similar.

I took a BA in Linguistics, worked for a while, then discovered computers. I spent a year on prerequisites and then did an MS in CS. I got good grades and did a thesis and it opened a lot of doors for me.

Some things that an MS CS degree will teach you that you may not have learned as a seasoned developer are: How to invent solutions to cutting edge problems. How to operate at scale using efficient algorithms and appropriate data structures. How to think about problem spaces. How to research. How to operate at the correct level of abstraction and how to get a level deeper when the abstraction leaks. The intersection between math, stats, and software. How to think like a computer.

To me it sounds like that's exactly what you want to do. One way or another you want these skills.

You may want to separate your desire for these skills from your desire to be credentialed for these skills. It is going to take a while to see how employers react to the Georgia Tech online MS. I believe the vast majority will treat it as second-class for a while. The judgment of HR departments is a lagging indicator. But the top tier employers may not care and just test you to see if you walk the walk.

You don't need a top tier school to get a good job. My MS is from a state university, and I work for Amazon.

<comment><AUTHOR> In order to get into an MS program would I need to do a BS in CS or just do the prerequisites I am missing. Off the top of my head I know that I am missing Calc 2, Calc 3, Linear Algebra, Algorithms, and Operating Systems. Does it matter where I do the prerequisites? I imagine I could just do the maths at a community college.

<comment><USER32> I did the exact same thing. You only need to do the prerequisites. No, it doesn't matter where you do them, but it's obviously best if you do them at the same school you intend to attend, as you'll be able to get recommendations from professors in the same department, and obviously the courses will transfer fine.

EDIT: FWIW, at the University of Colorado, I had to do 2 courses above calc 1 - for me that was calc 2 and statistics, as well as 5-6 CS courses.

<comment><AUTHOR> That's a really a good point about the letters of recommendation. I think this is the route I will be going down. I had no idea how I was going to get the letters otherwise.

Do you have to apply to take the prerequisites or do you just pay them and go?

<comment><USER32> At most schools, you can just take courses without a competitive admission process until you intend to enroll in a degree program.

</comment></comment></comment></comment></comment><comment><USER33> I think it's far and away self-study or if you can find a good online course among the free solutions you can start there. The Art of Computer Programming by Knuth has a lot of the theory included and doesn't hold back on the Math. Similarly, Introduction to Algorithms by Cormen, Leiserson, Rivest and Stein is quite good for the basis of Algorithm theory.

That being said, theory plays a small role in everyday development. If your primary goal is to increase your knowledge as it relates to development you don't want to focus on theory until it becomes a pain point. Algorithm theory helps with scalability, but practice is far more useful to programming. Conferences in your field that can expose you to new things to learn and different tool chains in your language are valuable. Learning a new related language can also be valuable you might consider learning iOS and then JavaScript which would let you work on Android, iOS and Cordova (formerly PhoneGap) applications at a level where you'd be comfortable going from JavaScript to native to write unavailable features.

If you're happy and have good opportunities on Android, focus on getting a deeper understanding: what are good open source repos, what coding conventions do they use, what frameworks and approaches could you know better. Are there parts of the OS you haven't worked with and wanted to? For instance, I built a demo app for LG designed for in-store promo devices where we hacked around in the OS to intercept the display of screens that would let the user delete apps from the phone and throw up a password lock that would kick them out to the main screen. Try and get a sense of where your best (however you measure it) opportunities are and focus your learning in that direction.

</comment><comment><USER34> At the end of the day I think its a question of what you value more "money" or "time". If money is your main concern, use books and online courses. If time is your main concern, get an MS at a good CS program.

My problem with teaching myself is that it's hard for me to stay motivated after the first couple of weeks. Now this just me -- it's not you. So maybe you don't have this problem at all, but I've found school to be a good motivator.

Plus having a good professor can help get through the tough spots. I studied complexity under Papadimitriou and he was great at explaining things I struggled with.

One problem with school though is you'll have less flexibility to skip things you don't care about, and investigate those things you do. That can be a blessing or a curse.

</comment><comment><USER35> You might be interested in my school, [http://hackreactor.com](http://hackreactor.com). Our course is 50% CS (data structures, algorithm design and analysis) and software engineering (modularity, refactoring) and 50% web fundamentals and writing a lot of app code, and students are constantly working together on extracurricular study. This weekend, they're throwing a machine learning workshop (developed by students; alums invited), and in two weeks we're playing host to a PL design/implementation class ([http://proglangmasterclass.com/](http://proglangmasterclass.com/)). You can reach out to me at email@example.com.

</comment><comment><USER36> SICP: [http://mitpress.mit.edu/sicp/](http://mitpress.mit.edu/sicp/)

6.004: [http://ocw.mit.edu/courses/electrical-engineering-and- comput...](http://ocw.mit.edu/courses/electrical-engineering-and-computer- science/6-004-computation-structures-spring-2009/index.htm)

6.042: [http://ocw.mit.edu/courses/electrical-engineering-and- comput...](http://ocw.mit.edu/courses/electrical-engineering-and-computer- science/6-042j-mathematics-for-computer-science-spring-2010/index.htm)

CLRS: [http://mitpress.mit.edu/books/introduction- algorithms](http://mitpress.mit.edu/books/introduction-algorithms)

</comment><comment><USER37> Sorry if this is obvious, but: read books. A good place to start is here: [http://cstheory.stackexchange.com/questions/3253/what- books-...](http://cstheory.stackexchange.com/questions/3253/what-books-should- everyone-read)

There was another reading list that I remember seeing, I think it was from Stanford's TCS website, but I no longer can find it.

Self-teaching is fun because you get to choose your own curriculum, but it's often frustrating too because if you get stuck, there is no professor or TA to unstick you. This issue can somewhat mitigated via the internet.

</comment><comment><USER38> I'm a Devbootcamp alumni, now working in a full time position. Just like you, I wanted to continue my learning and get more knowledge on algorithms, data- structures, and other things DevBootcamp doesn't teach you.

I strongly recommend \- Algorithms in a nutshell from O'Reilly ([http://www.amazon.com/Algorithms-Nutshell-In- OReilly/dp/0596...](http://www.amazon.com/Algorithms-Nutshell-In- OReilly/dp/059651624X))

and \- Cracking the Coding interview ([http://www.amazon.com/Cracking-Coding- Interview-Programming-...](http://www.amazon.com/Cracking-Coding-Interview- Programming-Questions/dp/098478280X))

Those two books are perfectly concise and straight to the point to understand and learn exactly what you feel you are lacking as a self-taught programmer.

The first one will teach you what you have to know, putting everything into work context, making it really easy to understand why and how this or that algorithm is useful.

Cracking the coding interview then offers really good challenges to practice and master those algorithms. And of course, if you are interested in getting a job, will perfectly prepare you for that ;)

</comment><comment><USER39> In answer to the first part of the question (how to get more theoretical CS knowledge), I studied an extremely theoretical degree and the materials are online to dig through - if I were to self-teach now, I'd start at the final year's course list ([http://www.cl.cam.ac.uk/teaching/1314/part3.html](http://www.cl.cam.ac.uk/teaching/1314/part3.html)) and work backwards to chart a path to the modules that sounded most interesting.

In terms of "taking knowledge to the next level", though, it could mean anything from you wish you knew what red-black trees and big-O notation were, to you'd love to be able to design your own programming language and write a compiler, to you wish you could administer a Linux box. I would actually suggest the best approach here is to find someone with the job you want and talk with them 1:1 to figure out where your knowledge could be most improved.

Also, for Coursera, etc, there are local study groups at places like Hacker Dojo you could join to get some of the benefits of college without the expense.

</comment><comment><USER40> One of the biggest factors I think you should consider if you want to go the self learning route is if you'll have the time to while juggling a full time job as well. You might be able to take a few courses, but will you be able to dedicate your full attention to it, and really dig into the subjects?

If I were you I wouldn't add on any more debt until I've settled my current one. With a good CS job, that shouldn't take more than 2-3 years, considering you have no dependants and presumably relatively low living costs. In the meantime, maybe take part time courses where you can get class credit, and if you plan it right you might be able to complete your degree in a year or so, considering you already have your basic requirements done. Just do some research into making sure your class credits will be able to transfer. Good luck.

</comment><comment><USER41> I'm a current senior Design & Development option at Penn State. The degree is basically worthless in terms of teaching you real software development. I did learn a lot about the social aspects of working for clients and working in teams, but I did not learn the proper structure to actually work on software. I literally spend all of my free time studying software development and computer science, because I know going to school will only yield me a piece of paper that will get me taken more seriously.

Here's a list of what I've done:

\- Learn more languages. Penn State only teaches Java. I've worked professionally with Python, have open source projects in Go, and have read books on Erlang, Haskell, Scala, Clojure. The more languages you know the more abstract concepts you'll know that you can apply in any language.

\- Watch online lectures in your free time. MIT Open Courseware, UC Berekely, Coursera, YouTube, InfoQ are all really good resources.

\- Start a reading collection. I have tons of books and white papers downloaded that I read.

\- Get an interest. I like distributed systems. I honestly don't know much about them, but I think the problems are interesting and I've read some of the important white papers that establish the field. Establishing an interest will help guide you down the rabbit hole.

\- Get out there and do stuff. Find a project on GitHub or make one with a circle of friends. Pick something outside your comfort zone. Even if the project never sees the light of production use, you'll learn from the experience. Having your name in open source projects AUTHORS/CONTRIBUTORS files is also very nice.

I'm getting closer to graduating, so I've been reading up on algorithms and data structures again because I know I need brushing up on it. I'm close to getting a compsci minor and was recently debating just getting a masters in it instead. If you want someone to vent your experiences at PSU, feel free to drop me an email.

</comment><comment><USER42> I studied finance in college. A few years later I asked a similar question, ended up enrolling as a post-bac student, and taught myself web development.

First, you need to figure out exactly what you want to learn. By theoretical, what do you mean? If your goal is to be on the same level as other programmers who are CS grads, then you might consider digging into algorithms and data structures and discrete math. This is pretty much the base of anything theoretical you'll do in computer science.

If you're in it to learn, go the udacity route. If, after completing all of their courses, you still feel you have some gaps, then you can go back to school if need be. If, on the other hand, your goal is to go into research, then you'll just have to bone up and go back to grad school to be taken seriously. In research, credentials matter.

</comment><comment><USER43> In addition to all the great advice here, if you want a bit of a more structured approach, check out Scott Young's MIT challenge: [http://www.scotthyoung.com/blog/mit- challenge/](http://www.scotthyoung.com/blog/mit-challenge/)

</comment><comment><USER25> Personally I would recommend doing a ms if you can afford it but if you can't I would recommend that you study the following areas Algorithms and data structures (this is a must) Systems organizations and architecture Systems programming Discrete math Math for cs books (generally proof based descrete and calculus based) Statistics and probability Then Start diving into areas that interest you like Metaheuristics Ai Machine learning Computer vision Compilers Device drivers Graph theory Computer Graphics (if your working in theoretical computer graphics strong maths skills are recommended) And the list goes on. Also read papers were in areas of interest. Papers are a great way to learn high level theoretical concepts.

</comment><comment><USER44> I am a law major, who did 1 year of engineering a long time ago. I always been a math geek, but 0 in CS. In my last year of college, i created a startup with some friends. It was a ERP for small lawyers firms. That didnt work out, but turned me on into CS.

Now i work as a product manager in a bigger firm (also law related), and i'm learning how to code through Coursera and Edx. I HIGHLY recommend them.

They are the future. The classes are very good. Way better than a regular class over here (Brazil).

If you are intereste in theoretical CS, here are 2 classes that you may be interested:

Programming Languages ([https://www.coursera.org/course/proglang](https://www.coursera.org/course/proglang)): It focuses on functional programming. The first edition was VERY high recommended. Here you will learn about functional paradigm, and the differences in using it in several languages (some purely functional, like SML, some hybrid, like Ruby)

Automata ([https://www.coursera.org/course/automata](https://www.coursera.org/course/automata)): It cant get more theoretical than this. The professor is Jeff Ullman. A legend. For free.

Machine Learning: A second version of Andrew Ng just ended. The third edition will be offered soon.

see.stanford.edu is also a very nice place to learn. They are actual stanford classes taped, and offered for free, online. I`m taking the three introdutory classes, and the machine learning classes.

Also, there are several architecture, compilers and algorithms classes too. After my first course (cs50.net), i realized that colleges (at least for CS) are redundant right now. They can be awsome. But, if you are short of money, or are already working, these online classes can fill the gap, easily.

add me on skype if you want to talk about more classes: lucasribeiropereira

See you!

PS. They can be VERY challenge. Take one, at most two at a time. 10-20 hours per week per course is a good rule of thumb

</comment><comment><USER45> If you can get a decent prof (not necessarily the most famous or well- published) to take you on to do a M.Sc., that beats the hell out of doing another B.Sc.. (Caveat emptor: Choosing a bad prof will bring you nothing but pain! Your supervisor is not just another prof. He will have an insane impact on you!) B.Sc.'s are the Honda Civics of academia. Universities mass produce them because they bring in the most cash per head. Grad school is more like a bespoke roadster or F1 car. The resources universities spend on grad students and research are disproportionate compared to what they spend on undergrads. Also, just as you learn more than just the core knowledge of your major in undergrad, you learn a lot of additional things in grad-school. Teaching, speaking, etc.. Above all, grad students are placed under pressure to actually _think_ instead of just regurgitating. If you do another B.Sc. you'll be repeating a lot of stuff you already know.

A good prof will figure out where your knowledge is lacking and give you the resources to catch up fast. You'll likely be thrown into some grad-level courses that are way outta your league and will have to work like a crazy bastard to catch up with students who have a CS B.Sc., but you'll have great student-teacher ratios and your best teachers will actually be the other students. You'll probably have to TA material you'll be learning the night before, and teaching something is a fantastic way to learn it well. Eventually, you should do some research, and hopefully you'll have chosen a prof doing something you're interested in. Do NOT do a course-based M.Sc., as those are just upgraded Honda Civics!

You'll be under intense pressure to learn a lot fast, but you'll have the resources to do it. A B.Sc. will likely take longer and you'll spend a lot of time slacking off because undergrad courses are pretty damned easy. Also, a M.Sc. is a better credential to have than another B.Sc..

When you're choosing a prof, talk to the other grad-students. DO NOT just choose the guy who was nominated for a nobel prize. As the saying goes, "Happy students never won anyone a Nobel!".

</comment><comment><USER46> Here are my picks. Hope they are helpful.

[http://cstheory.stackexchange.com/questions/3253/what- books-...](http://cstheory.stackexchange.com/questions/3253/what-books-should- everyone-read)

[http://www.nand2tetris.org/](http://www.nand2tetris.org/)

[http://rys.sommefeldt.com/2012/07/30/getting-by-in-a- technic...](http://rys.sommefeldt.com/2012/07/30/getting-by-in-a-technical- industry-without-a-degree.html)

[http://catb.org/~esr/faqs/hacker- howto.html](http://catb.org/~esr/faqs/hacker-howto.html)

</comment><comment><USER47> There are some good suggestions for topics and what all to learn, here are some links to actually go and learn em!

[http://stackoverflow.com/questions/194812/list-of-freely- ava...](http://stackoverflow.com/questions/194812/list-of-freely-available- programming-books)

and

[http://hackershelf.com/browse/](http://hackershelf.com/browse/)

Should have everything you need, they're all free / open-source books!

</comment><comment><USER48> Coursera, edX and Udacity.

I have myself taken half a course on Udacity(did not finish) and a Startup Engineering Course on Coursera. I've started a new course on Coursera and really enjoy the material on there.

Also, I'd suggest you read a lot, the internet is a treasure trove of information. I've learnt from long blog posts and free online books. Have a go and explore, you'll reach a point where you don't have enough time to study everything you want.

Goodluck

</comment><comment><USER49> One way of improving your knowledge is something you have already done.

Get another job that will force you to expand your knowledge. I am sure your job experience with your first start up is serving you better than a CS degree.

Similarly, a job which involves doing low level computer programming would force you to learn a lot of very practice CS, and you would be getting paid for it instead of the other way around.

<comment><AUTHOR> I have definitely been considering this approach. The issue with this is I don't think I am currently that desirable for anything that isn't Java.

</comment></comment><comment><USER50> It sounds like you're not quite sure what specifically you are interested in. CS is a very broad field and you could probably study it for a lifetime without scratching the surface.

Maybe better to choose a particular hard problem that is interesting and focus on that. Something that would be neat to do but isn't as simple as just calling a few library functions.

<comment><AUTHOR> I feel like I need to get the foundation that most people get in a BS before i can answer the question specifically. At this point I only know that I have a strong desire to know how computers work on a deep level.

<comment><USER50> There isn't really a standard foundation that everyone with a BS in CS has. Curriculum are different and different colleges will emphasize different things, not to mention that many courses are elective.

It also depends upon what you consider to be a deep level?

Are you interested in electronics and signal processing, mathematics or the structure/design of programming languages? Are you interested in individual computers or distributed systems? Are you just interested in computers or are you interested in using computers to model other things, like economics, physics or virtual worlds?

At a minimum you could brush up on algorithm / data structure understanding and some of the math behind that. Problem is that as soon you gain understanding of something it will simply expose you to deeper subjects that you don't fully understand. You will never reach the bottom of all of these rabbit holes.

<comment><AUTHOR> I have no illusions that I could possibly learn it all. I just want to learn enough so that I can go deeper on something more specific, such as virtual worlds, and no how to proceed.

<comment><USER50> Having a general CS education does not necessarily make you able to explore arbitrary fields. CS programs are ultimately designed by course administrators and professors and can be slow to change, so there's no guarantee that they will prepare you sufficiently to explore whatever avenues you wish to explore later.

Ultimately it depends on where you see your shortcomings that are preventing you from doing what you want. Do you wish you had better credentials so that you could get a job with better pay or more interesting work? Or do you find yourself frustrated because you are not able to sufficiently grok a certain subject area.

</comment></comment></comment></comment></comment><comment><USER51> I am suggesting an approach rather than a source. Sources, as someone already said it, are far from rare.

I would say pick up a single system, say database (relational or document) or routing, OS, DNS, Web server, A compiler, Filesystem, NFS, etc. and study the hell out of it.

Once you know how to understand a particular system in depth, everything else will start falling in place.

</comment><comment><USER52> There's a guy called Scott H. Young who, supposedly, did the entire (4 year) MIT EECS curriculum in a year. So, if you'd like to do it the REALLY hard way, try something like this: [http://www.scotthyoung.com/blog/mit- challenge/](http://www.scotthyoung.com/blog/mit-challenge/)

</comment><comment><USER53> I would also suggest professor Matt Might's blog post "What every CS major should know?" [http://matt.might.net/articles/what-cs-majors-should- know/](http://matt.might.net/articles/what-cs-majors-should-know/) also, check out his other posts, they're excellent.

</comment><comment><USER54> "I am not really worried about getting a job. This is about gaining knowledge."

Even so you want to be smart about it, and gain the knowledge in such a way such that employers will recognize your expertise. It is for this reason that I would rather recommend the MS. It will at least get you an interview next time you want to change jobs.

</comment><comment><USER55> Grow Beyond with Google: Guide for Technical Development [https://docs.google.com/file/d/0B_Y4kz709TVwaVZfdnl3blI3UWs/...](https://docs.google.com/file/d/0B_Y4kz709TVwaVZfdnl3blI3UWs/edit?hl=en- GB&forcehl=1)

</comment><comment><USER56> It might be worth your time to look at the course slides for "Gems of Theoretical Computer Science":

[http://www.ccs.neu.edu/home/viola/classes/gems-08/](http://www.ccs.neu.edu/home/viola/classes/gems-08/)

</comment><comment><USER57> I'm doing the Algorithms course on Coursera. It's fantastic. Interesting and practical, and taught by Princeton's Sedgewick. I have a BSc in AI and 20 years professional experience yet I'm still learning a lot from this course each week.

</comment><comment><USER58> Don't forget about the math side, too. Discretet math and linear algebra should be the minimum. Probability and statistics is also useful. Abstract algebra has interesting applications in CS, too.

</comment><comment><USER59> honestly? take a grad class in algorithms and sit in in as many relevant seminars as you can. conversation is much stronger for theoretical knowledge than it is for memorization. the idea is to work through the problems yourself with strong mentor support, so there really isn't a shortcut here.

</comment><comment><USER60> The previous suggestions are all good, but here's another tack, possibly better for self-teaching.

Tackle a big project: write an extensible text editor, design and implement a language and runtime, design and implement a new garbage collection system, or the currently quite popular RSS reader and feed provider.

</comment><comment><USER61> Same way you get good everything else, really. Train, learn, rest.

</comment><comment><USER62> CS or SE? Not clear from you statement.

</comment><comment><USER63> Universities tbh are more for meeting likeminded people nowadays: most of the stuff taught at CS can be learnt on your own given you're disciplined enough.

Just to underline some of the points others have made, here is a short list of things I found most valuable from my CS degree:

\- Algorithms, Datastructures & Computational/space complexity (ADC). <\-- This one is huge imo and will allow you to discern efficient code from inefficient ones.

\- Discrete Mathematics. It's the lingua franca when talking about CS and you will need it to understand ADC for example. It introduces set theory, graph theory and so forth, which are used in ADC/AI etc... to describe and solve problems.

\- Linear Algebra: if you ever want to work with 3d stuff, this one will be essential. It'll also work out nicely for 2d work, and seeing as you mentioned you've got a knack for UI work, you probably will appreciate this one. It'll allow you to get an understanding of for example affine transformations etc... You will need a computer graphics course too, but this is definitely a prerequisite course to do those.

\- Probability and statistics. I really hated this course (it's also one of the harder ones coincidentally), but once you "get it", you really do "get it". Ever wondered how gesture recognition works? Or how spam filters work? Well, the math required for this will be addressed here, together with the following subject.

\- Artificial Intelligence. Extremely useful if you're interested in game dev, or just want to learn to solve problems in a smart and efficient manner. It combines ADC with discrete mathematics with probability & statistics.

\- Calculus. If not for the math, it'll definitely make you look at things in a different way, which imo in turn, contributes to your way of looking at problems. Partial derivation / integrals and how it can relate to 3d surfaces for example. And let's not forget taylor series etc... It'll give you an idea of how mathematical functions such as sin(1) etc... can be implemented etc...

\- Operating systems, Computer Architecture/organization. Essential for understanding what happens under the hood. Allows you to reason about what the best code path is for solving a problem. Should you use the GPU for example instead of the CPU etc... and if so, why? etc... It also introduces models such as finite state automatons etc... which are also applicable in language processing for, say, compilers.

And that brings us to the last, but certainly not least subject, my all time favorite: \- Compiler construction. Gives you an insight in how languages are being processed, and how to design your own language and build a compiler for it. It should also give you additional insights on how runtimes/virtual machines work.

The software engineering courses were more about processes, philosophies and patterns etc... and even though they're definitely useful, I think most experienced software engineers have already "got this". Either via books, company policy/culture or via experience.

Again, these are my experiences, YMMV :) Good luck!

</comment><comment><USER64> Solve any 300 problems of the ACM problemset.

[http://uva.onlinejudge.org/index.php?option=com_onlinejudge&...](http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=1)</comment>


Is Stack Overflow making you dumber? - <AUTHOR> http://2s6c78.pen.io/

<comment><USER2> Before SO it was google groups/dejanews for me. I suppose it does make us a little lazier, but I don't ever take the answers on SO as fact. I always try them out and usually end up changing them around to fit my specific situation.

</comment><comment><USER3> This can be applied to any site that offers value. Before Stack Overflow, it was whether Google was making you dumber. In my specific case, no, SO has not made me dumber. I've learnt heck of a lot from that site.</comment>


Show HN: Daybook – A new take on personal journaling - <AUTHOR> http://www.daybook.io

<comment><USER2> Bit rushed this morning so no time to sugar coat this - hopefully it helps you get on track:

I think it might've been worth a bit more time before showing it off. The front page tells me nothing and the About page is waffly. Put in some screenshots of a nice example - that wouldn't take long. Saves me reading the text.

I tried the privacy.daybook.io link you provided, but that had a fancy pageturn, then two incomplete page promos (little point providing the first three words - not enough) and a burger menu that didn't do anything.

I clicked through to the Privacy Policy, then tried to use my back button and the page didn't change. The pageturning swipe introduced earlier doesn't seem to do anything here, but I can click the burger menu now.

There are also loads of typos in the copy. In some places it's "daybook", others it's "Daybook". Get a friend to proofread for you and standardise your product name.

Where's your Daybook? Make that one great and use that as the demo.

</comment><comment><USER3> You need a landing page, not a signup form. I'm not going to blindly input my name and email address in a form without any sort of context about the service.

<comment><USER3> SSL is needed, too. Transmitting passwords via plaintext is a gaping security problem.

</comment></comment><comment><USER4> This is beautifully designed, but otherwise I don't see how it differentiates from other personal journaling apps (e.g. 750words, or even Evernote, or _even_ Notepad), and I'm not about to sign up to find out.

I think you should wait until things are further along and then share this again with HN. I imagine you have a significant vision for this thing, but that's still opaque at this point.

Also:

> Daybook was built with the idea of providing a foundation where people can > write about their lives and save it for days to come, for generations to > see.

I'd be wary of putting any writing that I wanted to preserve "for generations" on a website that--no offense--might disappear in two months.

<comment><AUTHOR> Thanks for the feedback. As of right now the main difference would be the writing experience, and the way platform transforms the post into book-like form. There are still a few key features which I have yet to implement, but I thought it would be a good idea to show HN the site early so I could grow the platform from the outside in.

<comment><USER4> > way platform transforms the post into book-like form

OK, well... there's a reason mice have wheels now.

If you're committed to a page-turning UX, you might want to think about this as an iPad app.

</comment></comment></comment><comment><USER5> I suggest if showing something off, don't force user registration to be able to see what it is. It's shallow, but I don't want to spend time to register and possibly be subscribed to emails to see what it is.

<comment><USER4> I don't think it's shallow to not want to give my e-mail address out as a favor to someone I do not know.

I would love to see something like this in the HN guidelines (not that anybody reads those, but...)

<comment><USER6> It is already. From the Show HN Guidelines[0]:

> Show HN is for something you've made that other people can play with. HN > users can try it out, give you feedback, and ask questions in the thread.

> A Show HN needn't be complicated or look slick. HN users are comfortable > with work that's at an early stage.

> If your work isn't ready for people to try out yet, please don't put "Show > HN" in the title. Once it's ready, come back and share it then.

> For example, blog posts, email signups, and fundraisers can't be tried out, > so they don't count as Show HNs.

[0]: [https://news.ycombinator.com/showhn.html](https://news.ycombinator.com/showhn.html)

<comment><USER4> It doesn't sound like that's proscribing user registration (account creation), more just stuff like e-mail newsletters.

</comment></comment></comment></comment><comment><AUTHOR> This is side project I undertook this past winter-break. It's far from finished, but I though it would be great to show HN what I am currently working on. The app was more of scratching personal itch, rather than trying to bring order to the dozen blogging platforms. The app is just an attempt to give a different take on what could be if the intimacy of journaling and the power of the web where to come together.

<comment><USER7> It rankles me a little that you want to be a trusted voice in journaling, but can't be bothered to proofread or spell-check the very first descriptive paragraph anyone sees.

<comment><USER8> He's showing his project, it's best to keep condescending comments about the person to yourself. Just focus on what is needed to make the project better.

@Daybooks - Kudos for actually launching something. Done is better than perfect. Now on with comments that actually help the project.

Writing copy is always a pain - I still have issues with grammar and spelling, however my code is flawless :) It's a pain to proofread when you're heavily invested in the code.

The presentation is neat and clean. Until you get buzz that will do the explaining for you, it's best to put something on the front page for those who don't get what you have already. It feels intimate because you have to be in the know to have a good gist of what it does. However, it's all about your audience.

I like UI but for users with IE or older browsers, your dependence on HTML5 and CSS3 might pose a problem with adoption. Always have graceful fallback.

The images you're loading are sized way too large and take time to load. Kill the image sizes at 1080P and let responsive CSS do the rest. Faster load times and better presentation.

On the landing page or about page - show an actual example of what the daybook entry looks like. Is there a link or a screenshot?

It looks promising - is this public or private posting?

<comment><AUTHOR> Thanks for your suggestions, I have been working on making the images smaller and load faster. In reply to your question if the post is public or private, the answer is up to you. Initially your daybook page is private, this can be changed under settings, a published post is public and a private post is hidden from the site. I get this can be confusing and I'm working on adding clarity throughout.

In response to everyone else who commented, thanks for taking the time to share your thoughts, and I will be sure to update the page accordingly, i.e (copy, landing page, ssl, clearer publish button, demo, etc). I apologize for not commenting earlier, but being HN was not allowing me to comment at my usual speed, that and I was taking a history exam. Anyway, thanks for looking at the site, I hope in the next update will shed more insight as to what daybook can do.

</comment></comment></comment></comment><comment><USER9> I see a lot of care in the site.

But I had to be curious enough about why Daybook was a highly rated _Show HN_ to get past my first reaction. The

       All your email are belong to us.

of the link is, for me a complete turnoff. I haven't even seen what the Hell you're offering in return.

Why would I use it? If Daybook is for writers sell it that way. If it's more social media then pitch it that way. If it's a journal then pitch that. If it's all these things then come up with some sensible stories illustrating why a social media mavens would want an intimate journal.

Big suggestion. Make the writing/journaling tool standalone and make the product social media tooling and hosting. This better addresses the issue of what happens if Daybook becomes abandonware. Let me run the basis without shooting my intimate thoughts onto your server...unless I see a benefit from it.

Giving away the tool and monetizing the platform means the tool has to be good for writing and journaling But if it isn't a pure SaaS is dead anyway.

Good luck.

</comment><comment><USER10> I signed up blindly out of curiosity! Agree that some context on the service needs to be added. I love the simplicity and feel. Reminds me a lot of medium and I've actually often caught myself journaling on medium by accident because it's so easy to do.

\- The publish post button is weird though because I don't know what you mean by publish, is it being published to the public? Published as in like it's a finished entry?

</comment><comment><USER11> From your site I couldn't readily figure out what this offers that a private blog on an established site like wordpress.com or blogspot.com doesn't. At least we know that these players will not vanish anytime soon, and if they do, they're likely to do so "responsibly". I recall another attempt in this space called ohlife.com which has shut down apparently.

</comment><comment><USER12> Check your typos ([http://testtest.daybook.io/](http://testtest.daybook.io/)). Otherwise, its very pretty and easy to use. I like the pop-up profile editor.</comment>


The Nicest Place on the Internet - <AUTHOR> http://www.thenicestplaceontheinter.net/ <comment><USER2> Also the scariest place on the Internet!

When the page is initially black then out of nowhere, a large, and loud video starts playing, your heart skips a beat, and not just because a strange man is hugging your monitor!

Doubly true if you opened the link in one of many new tabs. Heh.

EDIT: Basically, don't auto play video, ever. Anyhow, thanks for the hugs.

</comment><comment><USER3> warning: this page auto plays audio/video.

it's also heart warming.</comment>


More Gyms Are Tapping into Pedaling for Power...and also for Profit - <AUTHOR> http://www.treehugger.com/files/2008/12/more-gyms-go-for-pedal-power.php <comment><USER2> If the additional energy gained over the lifetime of the equipment outweighs the additional energy required to build in a generator, and the copper, rare earth magnets, etc. built in couldn't be put to better use anywhere else, that's a marvelous idea. Otherwise it's a feel-good placebo.</comment>


Unit Economics - <AUTHOR> https://hackernoon.com/dear-unit-economics-i-hate-you-7c28b9aef08d#.ex1czp5un <comment><USER3> I'm dismayed that _twice_ , the titles have obscured what the essay is about. The article's title is _" Dear Unit Economics, I hate you"_ which buries the lede, and then the (original) HN submitted title _" The Most Terrifying Term in the Entrepreneurial Dictionary"_ is another distraction.

The article doesn't explain any strategic thinking or tradeoffs around "unit economics". It's mostly about the "on-demand" startups that are trying the "Uber for X" model not making money. Yes, their unit economics are bad (so far) but the author doesn't make a distinction between strategically losing money on purpose to try and gain market share vs a fundamentally broken businesses models that loses money forever.

Example of negative unit economics that turned out fine would be Paypal's $10 credit promotion for new account signups. They had negative unit economics from 1998 - <USER2>

Yes, the vast majority of on-demand startups will fail but they feel their unit economics will eventually become positive. A better analysis would explain why they will _never_ become positive. (If the speculation on eventual W-2 employee status for all "contractors" is the main reason, well, I suppose you could have titled the article _" W-2 threatens all on-demand startups"_) A lot of them are losing money _now_ but we (and the VCs funding them) already know that.

<comment><USER4> It would also be a better article (or good article at all) if it included actual examples of unit economics perhaps backed by data. I would love to see data showing that the majority of these companies are built on lies, but it's not here.

<comment><USER5> Agreed. I thought it was very strange that the article tries to imply that all on-demand startups beyond Uber are in trouble, when that's not actually the case. At least one, if not several, of the listed non-Uber companies are doing just fine.

<comment><USER6> Depends how you define being in trouble. I know a handful of people who started companies based on lies, and a true dose of narcissism, and were acquired with still nothing to show for

</comment></comment></comment></comment><comment><USER7> If your Lifetime Value is only "bigger" than your Customer Acquisition Cost, chances are you're still going to be operating at a loss.

A healthy aim is an LTV of three times your CAC: LTV > (3 x CAC)

That way - and remember that we're not talking hard figures here, just rough estimates - you're still aiming to cover your operating costs _in addition_ to "just" gaining customers.

<comment><USER8> But, a lot of business take years to figure out LTV. And investing in good customer service improving the product can all lead to a much better LTV. Also, there are many ways cut CAC in half possibly.

<comment><USER9> I always ask myself this whenever it is asked on Dragon's Den....could someone explain how customer acquisition cost is calculated? The "common sense" approach I'd think is something like:

(sales & marketing spend) / (customer count)

....but this would completely ignore whether the spend was efficient, so is there a more sophisticated way of calculating CAC?

<comment><USER8> if you can break out where your customers come from(which channel) you can get some idea of what the channel is contributing. but it even that's a little misleading because it's hard to get referrals if you don't have customers in the first place, so where do those get attributed to.

</comment></comment></comment></comment><comment><USER10> _Paying more money to get a premium service is not innovative in any kind of way. It's just another luxury service for people who can afford it, and this concept has been around for quite a while now._

Gig economy businesses that work are _growing_ the market, not just taking a share of an existing market. Uber works fantastically because they're cheap enough and accessible enough that people who previously didn't often take a cab now can. That's on top of disrupting the taxi market. If a gig economy business is aiming to lower costs for existing customers then their business model is _very_ wrong. They should be aiming to bring in vast numbers of new customers who _don 't_ use the luxury services already. That's where the money and growth lies.

<comment><USER11> Frankly, Uber's unit economy sucks so far, too.

</comment></comment><comment><USER12> This article is terrible. Author is clearly in over his head. The most important thing for startups is not unit economics but balancing resources for both product and marketing/growth.

With a startup you tackle challenges from highest risk to lowest risk. This ignorant author is missing much higher risks and using observation bias to confirm his beliefs.

</comment><comment><USER13> The whole article can be summarized by reading the last sentence: "some problems were just not meant to be solved."

That's it. The author doesn't believe the on-demand economy can work. The rest is just lead up.

I disagree with his assessment.

</comment><comment><USER8> unit economics are tricky though. Brand, Channel mix, referrals, PR, endorsements, and more can all effect CAC. customer service and targeting can have a huge impact on LTV.

<comment><AUTHOR> You're right! It can get a little tricky... Still, if you're unit economics don't work, you're going to have a hard time building a company.Disruptive business models sometimes work (and history is always written in hindsight)... But basic economic principles always hold true

<comment><USER14> The point is that unit economics are not some static thing, LTV is a product of conversion rates at each step of your funnel. Every step you improve by x% improves LTV by x% for new users (for this type of company at least).

<comment><USER8> Also, think of most small service businesses they hustle their ass off in the beginning with horrible CACs but then they start getting referrals and LTV/0 starts looking pretty good.

</comment></comment></comment></comment><comment><USER15> The article also misses the value of intangible assets and strategic options. Unit economics might be negative for now but who knows what a company might be doing in the future. Of course there might be wildly overvalued companies but may be negative unit economics can be seen as an investment in operational scale -- not diluting fixed costs but actually getting to scales where the economics change and new strategic options become viable. (Example: Uber moving from hailing to self-driving cars, obviously.)</comment>


How do you start a country? - <AUTHOR> http://www.bbc.co.uk/news/amp/world-40803430 <comment><USER2> "if it walks like a duck and talks like a duck, it is a duck".

By that definition, Taiwan is already a country, even though the UN still doesn't recognise it. My memory card says "Made in Taiwan".

It also makes California seem much more independent; my iPhone says "Designed by Apple in California", not "Made in USA".

In my opinion, anywhere that can make its own immigration policies and issue passports is a country. And anywhere that makes it easier for me to get one of those passports is a country I'm interested in.

<comment><USER3> > my iPhone says "Designed by Apple in California", not "Made in USA".

"Made in China"</comment></comment>


UC proposes its first enrollment cap on out-of-state students - <AUTHOR> http://www.latimes.com/local/lanow/la-me-ln-uc-limit-nonresident-students-20170306-story.html <comment><USER2> A couple of important notes FTA:

1) the cap is currently not limiting for the system as a whole, as the proportion is around 16%

2) It also includes a per-campus 20% cap, with raised caps for campuses that are already above 20%. So Berkeley, UCLA, and UCSD will be prevented from raising their nonresident proportions, and new growth will be redirected to schools like Merced (only 1% nonresident students).

My personal observation: no evidence is presented that nonresident admissions reduce the _absolute_ number of Californians the system can support.

<comment><USER3> That's because nonresident admissions don't reduce the absolute number of Californians the system can support!

They pay much more in tuition than the UC spends on their education, and much of the remainder gets spent on in-state residents.

In-state admissions have fallen at highly competitive schools like UCLA not because out-of-state students are taking up more of a set number of spots, but because the amount of in-state students whose educations the UC can afford to subsidize has fallen because of decreasing state funding per student.

Declining admit rates of in-state students is a problem, but out-of-state students are part of the solution. I really, really hope this proposal doesn't get passed.

<comment><USER4> Mass accepting out-of-state students is most certainly not a solution, it's a band-aid (not to mention it basically screws California taxpayers). The solution would be to just increase state funding AND cap out-of-state admit rates.

It's very hard for Berkeley and UCLA to stay competitive with Stanford and Caltech (and the Ivy League) when their private counterparts not only offer better financial aid for at-need low-income students, but are also starting to be in the same ballpark for _in-state_ middle-class students. Not only that, but the main idea behind the UC system is that it was intended for California students _first_.

UCLA had over 100,000 applications last year, the most out of any other school, public or private. I am completely okay with declining out-of-state students in favor of comparable California students. It's just that to afford that, the UC system needs more money. Heck, I even think price gouging out-of- state applicants could work.

<comment><USER5> "it basically screws California taxpayers"

It does literally the opposite. Out of state people are a net money gain, not a net money loss.

The more out of state people you can, the more instate people you can afford to accept.

<comment><USER4> > The more out of state people you can, the more instate people you can afford > to accept.

Except that classes are overcrowded, understaffed, and underfunded[1]. There might be a balance, but we're not there yet.. and what we're doing isn't working.

[1] [https://theaggie.org/2016/10/12/ucs-overcrowded-and- underfun...](https://theaggie.org/2016/10/12/ucs-overcrowded-and-underfunded/)

<comment><USER5> Correct. And removing the out of staters would make the classes more underfunded, and more understaffed, because they have less money.

</comment></comment></comment></comment></comment></comment><comment><USER6> > Her own child was turned down by her top three UC choices two years ago, > despite SAT scores and a grade point average above the 90th percentile. Her > daughter ended up at a fourth UC campus.

Why not simply follows Texas' _Top 10% Rule_ [1] ?

> The law guarantees Texas students who graduated in the top ten percent of > their high school class automatic admission to _all_ state-funded > universities

This top 10% rule, (in conjunction with a minimum SAT to avoid bad schools) would solve that mom problem (assuming the child is above the 90th percentile for that particular school).

[1] [https://en.wikipedia.org/wiki/Texas_House_Bill_588](https://en.wikipedia.org/wiki/Texas_House_Bill_588)

<comment><USER7> because there's too many people in california to do that.

there is a similar heuristic in place, but of course, the top 3 UC's is the same for everyone (berkeley, LA, SD)

[http://admission.universityofcalifornia.edu/freshman/califor...](http://admission.universityofcalifornia.edu/freshman/california- residents/admissions-index/)

<comment> Paul-ish In practice doesn't this direct everyone to UC Merced?

<comment><USER8> In short yes. Also UC Riverside.

</comment></comment></comment></comment><comment><USER9> Good. State universities are perversely incentivized to prefer higher paying students from out-of-state and international.

University of Washington, the state's top school, is now 1/3 non-state residents. It's a serious problem.

<comment><USER10> It's not perverse if out-of-state students fund reduced tuition for in-state students. But apparently that wasn't happening in the UC system.

<comment><USER3> I'm an undergraduate at a UC school right now, and I can tell you that that _is_ happening in the UC system. State funding per student has collapsed [1] and campuses are scrambling to cover the costs. One way to do that is by increasing tuition, and another is by admitting out-of-state students who pay massive premiums to attend the university.

Out of state students pay about $50k/yr to attend a UC. In-state students pay about $12K, and the UC spends a bit over $30k per student. That means that each out-of-state student provides enough revenue to pay for an _additional_ in-state student!

Absent additional state funding (lol), an enrollment cap would necessarily result in tuition increases. I really really hope it doesn't get passed.

[1] [http://www.ppic.org/main/publication_quick.asp?i=1119](http://www.ppic.org/main/publication_quick.asp?i=1119)

<comment><USER11> >Absent additional state funding (lol), an enrollment cap would necessarily result in tuition increases. I really really hope it doesn't get passed.

Or, how about the UC system reduces spending per student?

<comment><USER3> They already spend less than most comparably-ranked universities. If you take a look at the link I posted on the top-level comment, you'll see that expenses per student have been increasing pretty slowly.

Of course, waste should still be cut if it exists. Are there any specific programs that you think should have their funding reduced?

<comment><USER11> No expert, just a former student with a sense of fairness and disgust for waste. But I would hope to see:

-Cuts in administration size and salaries.

-Cuts in facility expenditures; figure out a way to do more with less.

-An increase in the number of full time faculty.

-An increase in faculty and graduate instructor compensation.

</comment></comment></comment></comment></comment></comment><comment><USER12> > The proposed limit on students from other states and countries — which would > be the first ever for the 10-campus public research university — comes after > a scathing state audit last year found that UC was hurting California > students by admitting too many out-of-state applicants. UC President Janet > Napolitano has blasted those findings as unfair and unwarranted, but state > lawmakers are requiring that UC adopt a policy restricting nonresident > students in order to get an additional $18.5 million in funding this year.

Isn't this blackmail? Or am I missing something?

<comment><USER13> The state is able to make funding contingent.

The state doesn't want to own up to the fact that UC is so underfunded that its struggling to fulfill its purpose of educating Californians. To get more money, UC turns to admitting more students who can pay full price. So the solution by lawmakers is to solve the symptom (too few students from California) rather than the problem (not enough money to support lots of in- state students).You can bet that when UC pushes back against being squeezed even more by the state, the state will use it as an excuse to cut funding more.

<comment><USER14> The UC system spends $120K/year per student, roughly 10x the tuition and fees a California resident will pay to attend.

The UC system also has an absurdly high ratio of administrative staff to academic staff, and administrative staff to undergraduates. It has become something of a jobs program for the state of California, and is the third- largest employer of a state that is the 6th-largest economy in the world.

Something has to give.

<comment><USER15> I don't know where your $120K/year per student figure comes from, but it seems highly misleading. The most recent figures I could find (AY 2012-2013) put the cost at $16,890. [https://www.universityofcalifornia.edu/news/uc- educational-e...](https://www.universityofcalifornia.edu/news/uc-educational- expenses-lower-today-20-years-ago-report-finds)

Research focussed universities like UC do of course spend a lot more on research, but those activities have their own dedicated funding streams, mostly Federal grants.

<comment><USER14> That core fund report seems to be missing something, as if the total total per-student cost were $16,890, the vast majority of that would be covered by the current $12.3K annual tuition (to say nothing of +$27K from out-of-state students). The UC system would therefore be unlikely to have the underfunded pension problem they currently face, for example.

Their annual budget is pushing $30B, and their student population–expensive post-graduates included–clocks in at around a quarter million.

Those numbers have changed from year to year, but last I checked, their total expenditures came out to around $120K/student. Texas A&M by comparison is around $90K/student, with Harvard pushing $200K (their tuition is 5x what the UC system's is, for comparison).

<comment><USER16> Your calculations are oversimplified. The real cost to a student should be around $20k.

Does the $30B per year not cover the funding for the UC medical centers, museums, athletic programs, etc.? The amount of money actually spent on students (through faculty salaries, financial aid, lab equipment, etc) is closer to $7B. Also you need to remove grad students from the calculation entirely, they disproportionately affect the numbers and they don't have out of state cap. Once you take all those factors into account you get ~$20k.

<comment><USER14> I'm not sure why those areas can be selectively dismissed. That the UC system overextends itself in a variety of non-instructional areas isn't a compelling case for its fiscal health and management acumen.

If I ran a training business with a negative P&L and couldn't fully fund my employee's pensions, I would hardly be able to say, "your calculations are oversimplified. Our losses include our museum and lacrosse team."

</comment></comment></comment></comment></comment></comment></comment><comment><USER17> Never knew CA was so anti-immigrant.

</comment><comment><USER18> Why not just accept the brightest students with the best resumes?

<comment><USER19> Out of state students pay more in tuition as compared to in-state students.

</comment></comment><comment><USER20> nb. This only applies to undergraduate students.

</comment><comment><USER21> I don't understand why is it ok for a university to serve a political purpose. A university is a place in which science is done, nothing more. No matter by whom.

<comment><USER22> Education policy is driven by politics. Saying that it's apolitical is just ignoring that aspect of reality.

<comment><USER23> Going further, government is controlled by politics and we are talking about a government institution.

<comment><USER24> Right; it's particularly stupid to say that politics (and hence gov't) has no role in an institution that exists as a governmental entity.

</comment></comment></comment></comment><comment><USER25> The review that was done awhile ago showed that nonresidents reduced the amount of residents in the program, any attempt to merely walk-over the issue is a sign that you are lying and speaking in poor faith. As if there never was any negative set of circumstances that could be predicated fundamentally on the idea that <outsiders> did in <Californian Residents/Insiders> people _from here_ , all that talk, and all that pretense when you rap to just your favorite music video......

<comment><USER26> >The review that was done awhile ago showed that nonresidents reduced the amount of residents in the program

Cf. what the audit actually found:

>The audit found that out-of-state applicants benefited from _lowered admission standards_ [italics mine], while California students increasingly were turned away from their campus of choice.

The only reason to give out-of-state students _lower_ admission standards than in-state students is if you're not merely admitting them but preferring them, and the _obvious_ motive in preferring out-of-state students is that they pay five times as much if not more in tuition compared to in-state students.

One way to evaluate proposed solutions to problems is "can the proposed solution solve the problem?"; if the out-of-state enrollment in 2006 was 5.5% and in 2016 was 15% and the cap is 20% (these are the real numbers) then obviously the proposed solution _cannot_ solve the problem and it is frankly questionable whether it is even a legitimate _attempt_ to solve the problem. It appears to instead be a way to politically grandstand by scapegoating the UC admissions departments and the out-of-state students instead of admitting there's a funding problem. The $18M in funding is also a pittance:

>UC spokeswoman Dianne Klein said the proposed policy balanced the needs of California students with the benefits that nonresident students bring — diverse perspectives as well as millions in additional tuition revenue, which added up to nearly $550 million in 2016-17.

Increasing the proportion of out-of-state students by 1% here appears to bring in about $50 million. There is not even a clear financial incentive for the UC system to bother following this directive! They would make more money by ignoring it.

The financial data indicates that the UC system will likely ignore this directive. Considering that the State used a tiny carrot instead of a big stick, they probably know this. If the State were serious in addressing this problem they could threaten to fine the UC system for discriminating against local students as was found in the audit. However this would kill the "golden goose" and result in drastic underfunding of the system because out-of-state students are currently covering a budget gap way bigger than this proposal could ever address.

So the legislature is not going to do that. They made this proposal to rile up gullible Californian nativists who think outsiders are the source of all their problems, and _you fell for it_.

<comment><USER27> Could an in-state student pay the out-of-state tuition to also benefit from the lowered admission standards?</comment></comment></comment>


Google/git-appraise: Distributed code review system for Git repos - <AUTHOR> https://github.com/google/git-appraise <comment><USER2> Can anyone disclose how extensively this is used within Google?

Their primary SCM and code review system is internal (and not git), as far as I'm aware.</comment>