Ferby's Blog
These are just some random ramblings, because I have nothing better to do with my time.

Tuesday, November 28, 2006

Busy Busy Busy

By John, Annie, Lucy and the Woof-Woofs at 4:17 PM

Two more weeks of class then a week of finals. I've gotten two of the homework assignments done and about two thirds of a project done. My GPA is going to suck this semester.

 

Tuesday, November 14, 2006

WTB 2 more weeks plzkkthx

By John, Annie, Lucy and the Woof-Woofs at 11:41 AM

So if you ever think that taking 3 programming classes, plus a physics class (that is all programming itself) don't. Save yourself the time and just buy a 4"x4" and shove that up your ass. It's about as pleasant as the homework load you'll get. I'm taking CSC 333: Languages and Machines, CSC 335: Databases, CSC 465: Networking, and PHY 324: I forget the title name, but it's all assembly programming with a microcontroller.

So aside from the 4 finals I have to do in 4 weeks I also have an assload of homework/projects.

  • In CSC 333 I have a compiler due this morning that is still not finished. I have a paper over a language that I haven't looked at yet that will count as our second test. I have have another homework assignment that will add the ability to use user defined functions to our compiler, and I have a group project in that language that I haven't looked at yet.
  • In CSC 335 I am going to have another book assignment in a week or so. I also have a group project to design a database and a frontend application along with 76 pages of documentation. This database will need to adhere to some standards that we might get to in our next lecture.
  • In CSC 465 I will probably have another book assignment before this semester is over. I have a test in there in a week or maybe this week, I can't remember. I also have another project to do. It is either research 5 questions (that probably aren't talked about in our book) and write out mini-essays for them each, or do a programming assignment. Normally I'd be excited to try this kind of assignment out, but with the time constraints, lack of teaching ability of my professor and the huge load of work I have this isn't going to be fun. We are to write our own networking protocol (i.e. write our own TCP). This must be done in C, and it has to be tested/used on a *nix system where we can acutally change the networking protocol that we use.

This, needless to say, has me stressed out and seriously considering quitting one of my jobs. Luckly I keep remembering that I am in debt and can't quit either of them. While my posts are few and far between, for the time being they might be fewer and farer between.(Don't worry Jon I'm still working on some problems for ya I just need to take the time and write them up.)

For some good humor: My hero.

 

Tuesday, November 7, 2006

CS Guide

By John, Annie, Lucy and the Woof-Woofs at 10:41 AM
So here it is, in all of it's glory.

Disclaimer:

Please take this for what it is. This is just my view of things and should not be considered a be-all end-all guide. With that being said I still think that there is much truth in the things in this blog and I hope it helps somebody (or at least keeps you all entertained). If I state anything in here as fact and it is (in fact) not true, then remind yourself that these are my thoughts and not an encyclopedia.


Languages:

As you know there are many different programming languages out in the world today. Some of the big ones are C, C++ and Java. At work I happen to use one called C# and for one of my classes I use one called OCaml. Something less obvious that that there are many different kinds of languages. For the sake of simplicity I'm going to group them into three categories.
  1. Normal: This would be the category I'd put C/C++, Java, and C# into. Most general programming is done with one of these languages. Everything in these languages are data driven. You pass in variables or constants to functions and they return values.
  2. Functional: These are programming languages were you can pass in functions or methods as parameters. Some examples are Haskell, OCaml, Scheme, and Lisp.
  3. Scripting: These languages are used to complete small tasks. Usually they are used for web sites, or system administration tasks. Some examples are Perl, Lua, Ruby, Python, and PHP.
Now the category I put those languages in isn't totally exact. Python can be used as a normal programming language and it has some functional language properties to it.

My suggestions if you want to become a programmer is to learn a normal language first. My advice is Java. Learning a normal language will teach you all the basic programming concepts, variables, operators, control statements, loops, and functions. Next I'd work on I/O reading in input from a user and modifying it in some way and printing the changes back out. Then work on file I/O, read in a file do some work to it and save it back out. Once you have those done then I'd work on Object Oriented Programming (OOP). Learn about objects, classes, methods, and abstraction. Take some of the basic data structures (a linked list, or a stack), and build it from scratch using OOP.

The next type to learn is a scripting language. PHP is easy, but I think you can learn a lot more from one of the others. Perl is a powerful language, but I think the way it is designed is god awful. Ruby and Lua look very promising to be a good starter for scripting. Doing a scripting language next is a good choice since all the concepts are pretty much the same as a normal language. The differences are the problems you are using a scripting language to solve. Write a web page that stores a record into a database. Or write a Perl script that will count the number of files in a directory that start with the letter 'a'.

This leaves the functional language. The thing I'd do before learning a functional language is study algorithms. I'm not saying that it is necessary, but I do believe it helps immensely. Functional languages are unique in that they allow you to pass in a whole function as a parameter into another function instead of just data. This is a hard concept to explain, but safe to say the concept it implements is awesome. OOP allows you to abstract over data. If you have a bank account you can create an object called BankAccount and store a person's name, address, and account balance, all as separate variables inside of that object. Making all the related information for an account in an easily obtainable location. Functional concepts allow someone to abstract over code. This allows for much shorter and clearer code. If you are lost don't worry, post a comment or send me a message and I can try to explain it better. My recommendation for a language to use is OCaml. This is what I used to learn functional programming and I think it is wonderfully easy and clear. I've heard horror stories about Scheme, and Lisp. Although both of those are more widely known and used.

I suggest learning Java, then data structures, then Lua/Ruby, then algorithms, and finally OCaml. Perl is the most commonly used scripting language in system administration tasks. So if you plan to be a *nix system admin Perl would be a value to you to learn. C is the biggest low level systems programing language. If you plan to write a graphics engine or an operating system it is the language to learn.

Operating Systems:

Now on to OSes. 99% of the people in the world know and use Windows to a moderate degree. This is fine for most people, but if you want to be a computer scientist and a programmer then windows is not enough. Aside from windows there are several big operating systems. I'll keep the the bigger ones I know, which are Unix, Minix, Linux, BSD, and OSX. These are all similar in nature and are derivatives from each other.

A Brief history real quick.
  1. Unix: It started with Unix which was created by Dennis Ritchie and Ken Thompson. This was the first main stream operation system. It was used mostly by universities.
  2. BSD: Berkeley University took the source code and modified it to their needs creating BSD. From there the BSD was updated and improved and still is.
  3. Minix: Minix was created by Andrew Tanenbaum to be an operating system for teaching the concepts that go into making an operating system. This is primarily used for educational purposes and embedded systems. I mention this one because if you want to do some kernel hacking and not be entirely overwhelmed this is a good place to start.
  4. Linux: From Minix Linus Tovarlds created his own OS called Linux. Over the years hundreds of people have contributed to the GNU Linux movement and to date there are about 52 billion different distributions for Linix floating around.
  5. OSX: This leaves OSX as the last, but not least OS to talk about. OSX is made by apple who most tech people seem to dislike. I say this because these people hate the idea that they can't upgrade their hardware and that OSX is a bad OS. I have two points to this. One, yes you can't upgrade your hardware very easily, but they do have excellent customer support who can do it for you, and besides how often do you really upgrade your hardware? Two, OSX is not a bad OS. It is based of of a BSD kernel so all the under the hood stuff that happens is done very efficiently and safely. As for the other stuff, the GUI is beautiful and seems pretty user friendly. I think using one menu bar to to represent all of your open windows is a pretty cool idea. Basically which ever window is open it's menu bar is at the top. This can save a lot of desktop space.

So we've established that you know Windows. I'll assume that you'll learn to program on windows. Get used to using a text editor and using the command line to compile programs. This is great, invaluable knowledge to learn. You can cut/copy/paste files, navigate through folders, and basically do all of your day to day stuff in windows.

I think to really be a good programmer, and computer scientist you need to be able to understand and use multiple systems. So assuming you know windows (if you don't then that should be one OS that you learn since > 90% of the corporate work uses it) I suggest that you learn some *nix system. I think learning OSX would be easiest since it has such nice GUI capabilities, but learning a system that uses a command line heavily would be more beneficial. I suggest Linux. There seems to be a bigger following for Linux than BSD on the internet so you are more likely to find a wider range of HowTos and more people willing to help you solve your problems. Unix is an option, but since it is now mostly used it corporate or university servers it is harder to get a hold of a place to work with one, and finding help might be harder. You can use Minix, but is a much simpler OS. I highly suggest Minix is you want to do kernel hacking or want to really see how the concepts of an OS work.

So I recommend Linux, and out of the 52 billion distros out there which one do I suggest to you to use? Ubuntu or one of it's variantes, Kubuntu, Xbuntu. They tote themselves as the most user friendly distro that "just works" and I think they are right. They have nice GUI elements, less command line dependent than other distros, fewer config file tweaks, and it supports a wide range of hardware out of the box. I think it's a great starting distro and they have a wonderful community that are always willing to help people out.

So are you still reading? I realize that this is huge and it only covers two topics, but I think they are the two biggest topics out there. From my experiences as a CS student these are the two that have had the most impact on my learning. If you have any questions feel free to post a comment of send me a message on aim: Ferby7424.
 

Sunday, November 5, 2006

Lazyness pwns me

By John, Annie, Lucy and the Woof-Woofs at 2:42 AM
So not only has it been over a week since my last blog, but I haven't completed anything that I said I was going to do. While I haven't done any of the things that I talked about I do have a very good excuse... I'm lazy. That and I've been really busy. I'm currently in the process of writing a tiny virtual machine for a homework assignment. So between that and work it's kept me with little free time. I did start writing that guide and I will have it posted by monday night, so look for it Tuesday.