Computer Science 101

144 views
Skip to first unread message

Rainu Ittycheriah

unread,
Feb 13, 2017, 11:25:40 AM2/13/17
to Penny University
Hallo All!

I realize this might be a wide net to cast, but I wanted to see what everyone thought. Recently something I've been reflecting on is my lack of theoretical knowledge when it comes to the depth of a computer science degree. That being said, I have heard a lot of varying advice from "just learn it when you need it" to "if you're really curious, find stuff online and here's a couple links". As someone who really values depth and breadth, how and what should I start learning to help fill in the gaps that I didn't get to learn by going to a software bootcamp over a traditional four year degree in engineering, math, or computer science? 

What has really sparked my interest was working with a senior who had a math degree and could speak very intelligently about how languages work, interpreters, compilers, and how/why they work with the underlying hardware. How can I learn more about how to not just code well, but design well when it comes the blurred line between code & hardware? 

Would really appreciate anyone's thoughts, conversations, and any resources!

Jason Myers

unread,
Feb 13, 2017, 11:28:48 AM2/13/17
to Rainu Ittycheriah, Penny University
Hey Rainu,
    So one resource I really like in this area is https://github.com/open-source-society/computer-science. It's a great place to get an idea of what is studied in Computer Science.

Cheers,
Jason
--
You received this message because you are subscribed to the Google Groups "Penny University" group.
To unsubscribe from this group and stop receiving emails from it, send an email to penny-universi...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/penny-university/a32cdac7-f51d-468d-b66d-dc3bf5aa081c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

rcarr

unread,
Feb 14, 2017, 1:01:19 PM2/14/17
to Penny University
Hey Rainu,

I recently decided to go the academic route and would happily discuss how I made this decision in a google chat.  Feel free to message me.

Alex Simonian

unread,
Feb 14, 2017, 1:58:14 PM2/14/17
to Penny University
What courses would go on the priority queue in terms of bringing value to a company as a developer, given time as a constraint variable? I am sure it is context dependent on the type of job, e.g. data science vs web developer, but I am talking in general terms. My vote is for a solid foundation in data structures and algorithms first, with maybe design patterns or compilers second. Would like to hear some thoughts from senior developers and architects.

JnBrymn

unread,
Feb 15, 2017, 9:59:38 AM2/15/17
to Penny University
Ping me on the Penny U Slack (@JnBrymn) and we can video chat for a few minutes. Or contact me next week when I'm back in town (jfberrymanⓐgmăil·com) and we can have coffee some morning. I want to get a sense of where you want to be and then I can give you my _opinions_ about how to get there.

Also - cultural note to everyone: Try to drive conversations toward real-life meetings if reasonable. The hope with Penny U is to build up a community where everyone knows each other on a personal level. If we stick to text, then we are recreating a very bad version of Stack Overflow :P

jason.orendorff

unread,
Feb 15, 2017, 8:15:52 PM2/15/17
to Penny University
On Monday, February 13, 2017 at 10:25:40 AM UTC-6, Rainu Ittycheriah wrote:
Hallo All!

I realize this might be a wide net to cast, but I wanted to see what everyone thought. Recently something I've been reflecting on is my lack of theoretical knowledge when it comes to the depth of a computer science degree. That being said, I have heard a lot of varying advice from "just learn it when you need it" to "if you're really curious, find stuff online and here's a couple links".

Hmm. You may have gotten some bad advice.

"just learn it when you need it" - Obviously this can't be right all the time. Formal education wouldn't exist.

"if you're really curious" - also kind of dismissive

"find stuff online and here's a couple links" - "Find stuff" is hardly advice at all; links are good but they come in two flavors: links to 15 minutes of good content and links to books. The former is, at best, delightful.

As someone who really values depth and breadth, how and what should I start learning to help fill in the gaps that I didn't get to learn by going to a software bootcamp over a traditional four year degree in engineering, math, or computer science?

Find out what Jason Myers did. If as I suspect that requires an impractical time investment, fallback plan:

Read books or take courses.

The fundamental problem to be solved is this: I have X amount of time a day to spend learning; how do I spend it efficiently? An expert tutor is best. Books and courses are second best. More advice:

- If you take courses, join a study group and do the homework.
- If you read books, pick books with exercises and do the exercises.
- Not all books are good and not every good book is good for everyone. Try lots of them.
- There is no reason to finish a textbook (unless it's just that good). Real courses do not cover textbooks end to end.

(I'm not good at taking my own advice, so, grain of salt...)

What has really sparked my interest was working with a senior who had a math degree and could speak very intelligently about how languages work, interpreters, compilers, and how/why they work with the underlying hardware. How can I learn more about how to not just code well, but design well when it comes the blurred line between code & hardware?

These topics are close to my heart. I got a pretty standard university EE/CS education, and seeing all the parts of this stack fall into place, so that I felt I had a rough understanding of it all from top to bottom, was the prize. You might enjoy:

    Building a Modern Computer from First Principles
    or, Elements of Computing Systems
    http://nand2tetris.org/

Available as two free courses on Coursera, or as a book. I haven't actually taken the course or read the book, so YMMV.

-j

Alex Simonian

unread,
Feb 22, 2017, 1:15:53 AM2/22/17
to Penny University
Great chat with John and Rainu.  

Definitely a good idea to have a decent understanding of more of the theoretical computer science topics.  Below were some of the top priority topics, in lieu of formal computer science degree, to cover.

  • OOP design patterns -- book recommendation (Head First Design Patterns) Knowledge of OOP design patterns helps to write reliable, scalable, testable, efficient, decoupled, modular... in short, well-written software that large teams can contribute and that stands the test of time.  Certain problems lend themselves well to specific design patterns.  Being able to spot and recognize these patterns in day-to-day work is useful for honing one's intuition of the problem domain. Some patterns can also lead to problems down the road.  The singleton is such an anti-pattern that can cause coupling issues.
  • Algorithms and data structures - book recommendation (Grokking Algorithms)  Sort and search, data structures (trees, graphs, arrays, linked lists, hash tables), and the runtime/space complexity of algorithms and data structures Big O notation.  Systems programming relies heavily on the usage of data structures and algorithms.  For example, Git uses graphs and cryptography and Elasticsearch utilizes trees for search engine.  As an end user, you will have a deeper understanding of the various tradeoffs and know when and how to use them effectively for a particular application.  Understanding the overarching concepts of algorithms and DS and how they fit in with the big picture is what is helpful, rather than reciting each line of code for the particular algorithm.
  • Other programming paradigms and languages -- static vs dynamic, functional, etc Go, Java, Haskell.  Each programming language has a set of unique strengths and some are more suitable than others, depending on the problem domain.  For example, huge messaging systems that require fast delivery and fault tolerance are very well suited to a language called Erlang, which was written to control telephone switches, this is why WhatApp was written in Erlang.  When performance is absolutely critical the fastest language is Assembly, but most people are too afraid of Assembly these days and choose to use C  / C++.  Java had it's hay day in the enterprise 10 years ago, but it exists today mainly to support those legacy systems.  It also seems to have a strong nice in search products, like elastic search and spark.  JavaScript is good at async execution, so there is no language that is best at all things, although Python is one that can do many things very well.  C extensions are the way to go in python, in terms of speed.  Also there is a lot of work currently being done to do JIT compilation for python, i.e. turn python code into C and compile it just before it executes, this can produce huge benefits in terms of speed.  The one main issue with C Python is the global interpreter lock.  This effectively keeps C for executing in parallel, i.e. true multiprocessor support (want to use all your cores, yo), although in most cases this can be worked around.   Other implementations like Jython (which is written on top of Java) don't have this issue so you get true multiprocessor support out of the box.

JnBrymn

unread,
Feb 22, 2017, 9:15:20 AM2/22/17
to penny-un...@googlegroups.com
For me the conversation was a good refresher. I got to think through my own academic pursuits as a person who moved into software from a different career. For me academic pursuits fall into two overlapping categories 1) learning things because I realize that I need the knowledge 2) learning things because they are interesting and usually because they are somewhat adjacent to things that I needed to know. In my particular case, this meant reading blog posts, books, and Wikipedia articles.

Ultimately though the important takeaways were rarely the specifics of an algorithm or data structure. Instead they were a general knowledge of what is out there and how to think about the problem space. For instance, at different points I have had very specific knowledge about how different technologies work (Elasticsearch, Cassandra, Neo4j) but the most useful takeaway is the intuition about which technology applies better to which problem domain. Similarly I learned how various sorting and graph algorithms worked in the past. If I wanted to remember them I'd largely have to look them up again. But the takeaway was the ability to see how various types of things are done and the ability to take performance considerations into account.

Harrison Pickett

unread,
Feb 23, 2017, 10:29:37 AM2/23/17
to Penny University
https://www.youtube.com/playlist?list=PL8dPuuaLjXtNlUrzyH5r6jN9ulIgZBpdo

This series just started, so I don't know what it will cover. In the preview they specify that it 'will not teach you how to program', but not much else. I don't know if that means it will simply be the history of computing, or if it will tackle topics like formal logic, analysis of algorithims, state machines, context-free grammars and all the other not-math things that were covered in my computer science education.

I generally view a Crash Course series as the high school level of a topic. But my high school education was severely lacking in all but the most basic of computing topics, so I'm having trouble guessing at exactly what will be included. I just thought I'd drop it here as it has some potential and seemed on topic for this thread. :-)

pegbe...@gmail.com

unread,
Feb 24, 2017, 12:07:21 PM2/24/17
to Penny University
Thanks for this conversation, everyone.   Very timely and helpful for me.

I did study computer science (ages ago ;), but a lot of that "theoretical" knowledge has gotten pushed aside by the specific things I needed to know and use for given job assignments.   You do forget a lot of the things you studied when you don't use them in your day-to-day work  (or at least, I did...). 

Based on what I've been doing most on the job (writing code pretty close to the hardware), I cannot remember the last time I had a conversation at work about Big O notation and which optimal search and sort algorithms to use for various tasks/large data sets.   But solving a weird problem involving big/little endian-ness or boot performance issues related to entropy/random number generation on a "factory fresh" boot?  Those things I actually ran into, and the concepts stayed fresher.

I'm recently back in the job market and spending a lot of time refreshing on a range of core CS topics.  One big tech company sent me a form letter/multi-page list of interview preparation tips and technical topics to review (yikes!).  I'm currently making my way though it.  Ping me if you want a copy -- includes much of what's been discussed here. 



Off to study some more!  Appreciate the recommendations you all have made.  I am in the middle of "Grokking Algorithms" and love the presentation -- not overly "academic" and doesn't make my brain hurt  :)

Peggy

Jason Myers

unread,
Feb 24, 2017, 12:13:29 PM2/24/17
to pegbe...@gmail.com, Penny University
I'd love to see that Peggy, just to see what employers think is valuable.

Cheers,
Jason
--
You received this message because you are subscribed to the Google Groups "Penny University" group.
To unsubscribe from this group and stop receiving emails from it, send an email to penny-universi...@googlegroups.com.

JnBrymn

unread,
Feb 24, 2017, 10:54:28 PM2/24/17
to Penny University, pegbe...@gmail.com
I'd love to see the preparation tips and technical topics to review too Peggy. You can actually attach files to the topics here if you're open to that option.


On Friday, February 24, 2017 at 11:13:29 AM UTC-6, Jason Myers wrote:
I'd love to see that Peggy, just to see what employers think is valuable.

Cheers,
Jason



Thanks for this conversation, everyone.   Very timely and helpful for me.

I did study computer science (ages ago ;), but a lot of that "theoretical" knowledge has gotten pushed aside by the specific things I needed to know and use for given job assignments.   You do forget a lot of the things you studied when you don't use them in your day-to-day work  (or at least, I did...). 

Based on what I've been doing most on the job (writing code pretty close to the hardware), I cannot remember the last time I had a conversation at work about Big O notation and which optimal search and sort algorithms to use for various tasks/large data sets.   But solving a weird problem involving big/little endian-ness or boot performance issues related to entropy/random number generation on a "factory fresh" boot?  Those things I actually ran into, and the concepts stayed fresher.

I'm recently back in the job market and spending a lot of time refreshing on a range of core CS topics.  One big tech company sent me a form letter/multi-page list of interview preparation tips and technical topics to review (yikes!).  I'm currently making my way though it.  Ping me if you want a copy -- includes much of what's been discussed here. 



Off to study some more!  Appreciate the recommendations you all have made.  I am in the middle of "Grokking Algorithms" and love the presentation -- not overly "academic" and doesn't make my brain hurt  :)

Peggy

--
You received this message because you are subscribed to the Google Groups "Penny University" group.
To unsubscribe from this group and stop receiving emails from it, send an email to penny-university+unsubscribe@googlegroups.com.

pegbe...@gmail.com

unread,
Feb 25, 2017, 7:29:10 PM2/25/17
to Penny University, pegbe...@gmail.com
 A couple of people have inquired, so I'm posting a slightly scrubbed version of the interview prep doc here.  


On Friday, February 24, 2017 at 9:54:28 PM UTC-6, JnBrymn wrote:
I'd love to see the preparation tips and technical topics to review too Peggy. You can actually attach files to the topics here if you're open to that option.

On Friday, February 24, 2017 at 11:13:29 AM UTC-6, Jason Myers wrote:
I'd love to see that Peggy, just to see what employers think is valuable.

Cheers,
Jason



Thanks for this conversation, everyone.   Very timely and helpful for me.

I did study computer science (ages ago ;), but a lot of that "theoretical" knowledge has gotten pushed aside by the specific things I needed to know and use for given job assignments.   You do forget a lot of the things you studied when you don't use them in your day-to-day work  (or at least, I did...). 

Based on what I've been doing most on the job (writing code pretty close to the hardware), I cannot remember the last time I had a conversation at work about Big O notation and which optimal search and sort algorithms to use for various tasks/large data sets.   But solving a weird problem involving big/little endian-ness or boot performance issues related to entropy/random number generation on a "factory fresh" boot?  Those things I actually ran into, and the concepts stayed fresher.

I'm recently back in the job market and spending a lot of time refreshing on a range of core CS topics.  One big tech company sent me a form letter/multi-page list of interview preparation tips and technical topics to review (yikes!).  I'm currently making my way though it.  Ping me if you want a copy -- includes much of what's been discussed here. 



Off to study some more!  Appreciate the recommendations you all have made.  I am in the middle of "Grokking Algorithms" and love the presentation -- not overly "academic" and doesn't make my brain hurt  :)

Peggy

--
You received this message because you are subscribed to the Google Groups "Penny University" group.
To unsubscribe from this group and stop receiving emails from it, send an email to penny-universi...@googlegroups.com.
Interview-prep.rtf

markel...@gmail.com

unread,
Feb 26, 2017, 8:45:55 AM2/26/17
to Penny University
Great thread! There have been some really great and educational contributions here.
Thanks for sharing this document Peggy.

Brandon Bradley

unread,
Mar 1, 2017, 11:09:30 AM3/1/17
to Penny University
@jo

Really like your response. The focus on learning with other people was a good reminder for me.

-blbradley


On Wednesday, February 15, 2017 at 7:15:52 PM UTC-6, jason.orendorff wrote:

Chang Lee

unread,
Mar 1, 2017, 2:38:34 PM3/1/17
to Penny University
Just got the book Head First Design Patterns. A heads up: it is for people who know some Java or C#. For now I know neither so maybe I'll come back to the book later, but the intro looks pretty good.

Alex Simonian於 2017年2月22日星期三 UTC-6上午12時15分53秒寫道:

Alex Simonian

unread,
Apr 4, 2017, 2:46:40 PM4/4/17
to Penny University
The best book that was recommended to me as an introduction to Comp Sci for those of us who may have a degree from another field is Imposter's Handbook by Rob Conery.

This book covers all the essential topics you would find in a strong comp sci program at a University.  You get the TL;DR on topics such as complexity theory, big O, lambda calculus, algorithms, databases, etc  Gain a broad understanding of what exists out there, so you can delve further if you so choose.  As we are all familiar, languages and frameworks come and go, but the broad principles of what you are essential doing in computer science remain as a body of knowledge.  I think Hal Abelson, who taught the Lisp course at MIT for years said it best that computer science is a horrible name for this discipline.  It is easy to confuse the tools with the essence of what you are doing.  Comp science could be best seen as a formal study that systematizes notions of how to do stuff.

Personally, I think it is best to perform the craft of programming for awhile (or in parallel with a degreed program), and then go back and explore the theory as a retrospective as to what you are doing.  Same can be said if you have a degree in economics or finance. They don't make you an economist or financial analyst without putting those ideas into practice.

Cindy Williams

unread,
Apr 10, 2017, 11:03:58 PM4/10/17
to Penny University
I have a computer science degree, and this article does a fantastic job (better than some of the professors I had) of explaining the general concepts that I learned in college:

40 Key Computer Science Concepts Explained In Layman’s Terms
Reply all
Reply to author
Forward
0 new messages