Tuesday, January 6, 2009

Re: [BLUG] Looking to study further in computer science

I just gotta say that was an incredibly thoughtful and useful post by Steven.

As a programming (and general technology) learner and teacher, all
your suggestions ring true.

An observation: I've only ever learned a language because I needed to
or wanted to do something specific and using that programming language
was a means to that end.

I learned HTML when I was on a webpage building kick back in the 90s.
I learned CSS and SSI when I neededto support a website with a lot of
different pages.
I learned BASH because I needed to administer a few hundred Linux boxes.
I learned Java and Python and C because I needed to teach them to high
school kids.

I've never learned a language because I wanted to learn it.

I played a lot with GWBASIC and MBASIC as a child, my dad even got me
some tutorials to run through, but I never used it and it faded away.
I played through several JavaScript tutorials and books, but I was
having more fun with the cool stuff that I could make it do than
anything really web-related and forgot it all after I moved on.
Same goes for Visual C++ when I decided to learn "real" programming
after the short stint with JavaScript.

Having a goal to aim for with it or a consistent need to use it meant
I had consistent enough long-term exposure working with it that it
somehow stuck (at least the syntax and grammar, maybe not too much
vocabulary now that its been so long).

Sitting and working my way through tutorials because I wanted to "be
able to use X language" never really stuck

On the plus side, though, I went through so many computer languages
shallowly, that the fundamentals that are shared across them kept
getting hammered into my head and I probably gained a better general
understanding of computers than if I'd focused on any one language.

Good practice for teaching programming, I guess. ;-)

Take care!

Simón

_______________________________________________
BLUG mailing list
BLUG@linuxfan.com
http://mailman.cs.indiana.edu/mailman/listinfo/blug

Re: [BLUG] Looking to study further in computer science

On Tue, Jan 06, 2009 at 11:04:13AM -0500, Ben Shewmaker wrote:
> Thanks for everybody who replied to my question, it was very
> interesting reading the discussion that followed. Programming
> languages, much like Linux distributions, have their own strengths and
> weaknesses and also come with their evangelists and detractors, it
> would seem.

Most assuredly you are correct.

> From what I've been reading here and elsewhere what language is used
> for any particular project can depend greatly on the problem to be
> had, the organization working on said problem and the preferences of
> the people working on the problem.

In many cases the coding style changes just as frequently, too.

For instance, the GNU C folks have a particular coding style, but the
Linux kernel people (who also write in C) say to print it out and burn
it as it is total crap. They have their own coding style.

This isn't limited to C/C++. It is an issue in most languages. Some
languages (such as Python) have gone so far as to try to standardize
on official recommendations for style, but there is always a stickler
somewhere that wants some back-asswards method of structuring their code
because they think it looks better for some reason. (Number one being
exposure to another language.)

If you contribute to someone else's code, try to follow their coding
style. Never, *ever* make style changes in someone else's code. In your
patches, do everything you can to obey their coding style, even if you
think it makes absolutely no sense. Changing coding style (even in files
you write from scratch) it is a sure-fire way to have all your patches
ignored.

> I also liked what Jeffery said about fundamentals of programming.
> Perhaps it isn't that similar [...]

As an anecdote: I don't write PHP. I've never written PHP. I've never
read anything about PHP. I've never wanted to write anything in PHP.
A product I was using (which was written in PHP) had an annoying bug.
I used my general source skills to find the proper region of code,
and once I found the location, knowing the expected behavior, and the
produced behavior, I instantly knew the problem and how to fix the
problem. I had to scan other regions of the code to find how the author
was doing things, as I didn't really know how anything was done in PHP,
let alone the which of any two common options the author favored. (I
didn't even know the name of the else-if construct.) I did, however,
solve the issue quickly and accurately.

The fundamentals matter. As others have said, with the right
fundamentals and a good core understanding of general language features,
you can fairly easily move from one language to another as needed.

> This leads me to another question: What are some of your favorite
> resources for programming fundamentals? Books, blogs, websites?

For programming *fundamentals* I always found nothing beat good printed
documentation, some well-written examples, and a lot of practice. If
you're in doubt as to the accuracy of the documentation or quality of
the examples, I recommend leaning more heavily on the practice.

But what are programming fundamentals? In part, these are broad
programming features found in every language (like functions and
variable scoping). In part, these are programming techniques used for
any language (like object-oriented design (which you can do in any
language -- even assembly), rapid-prototyping, "agile" development,
etc). In part, these are specific core language features found in a
specific language (Pointers and Lvalues in C, function decorators in
Python, the $/@ variable prefixes in Perl). In part, these are specific
technologies usable in any language, but with differing semantics and
APIs (like network code -- while "BSD-style networking" is frequently
available, most of the time higher libraries are built up which are
preferred instead -- and required if you want to be cross-platform).

So many languages draw from C syntax, and/or directly from C libraries
that knowing enough about C to read an example and interpret it to your
language can be considered a fundamental skill if API documentation for
your chosen language is lacking.

I'm biased toward practice primarily because I'm self-taught. Certain
things work well from books. Book learning should cover all of the
fundamentals in principle, but only practice will prove whether you
understand things when you need them.

Don't worry about memorizing APIs. APIs always change. All you
really care about is that you remember enough to easily look up
the documentation in the future. That and you do care about the
fundamentals, of course.

> Or perhaps I can also ask what are important fundamental concepts
> I should grasp? I am eager to start practicing in any number of
> different languages, but I really want to make sure I understand
> why things work the way they do. I don't want to end up a mediocre
> programmer, slaving away in Java day after day building ucky software
> because I didn't build a solid base.

Heh. I covered an overview of the things I think are core concepts.

The same things apply with regards to learning programming as apply with
learning anything: Don't settle for rote answers. Ask questions until
you fully understand things. When you have documentation available, read
it for fun and not just to get a better grade.

In general, a brilliant example of your work always trumps school
grades. In the real world no one cares about your GPA, they only care
about whether or not you know your stuff. Unfortunately there are many
cases of people with "book smarts" who know everything on paper and got
great grades, but they're still crappy programmers. Having a degree does
help -- I won't deny that -- but only the most horrible work places care
more about that than about practical skills.

My father considers programming a fine art. There isn't a single one
of the arts, whether it be creative writing, playing music, painting,
sculpting, etc. where they don't lean heavily on understanding first the
basic principles, and secondly practice, practice, practice.

Cheers,
Steven Black

_______________________________________________
BLUG mailing list
BLUG@linuxfan.com
http://mailman.cs.indiana.edu/mailman/listinfo/blug

Re: [BLUG] Looking to study further in computer science

This discussion has been quite interesting. My son asked me a similar
question recently, so I have been forwarding many of the thoughtful
messages to him. Of course I have my own opinion on much of this, but it
is nice to have a wider range of opinions for someone who is already
through with his undergraduate education.
_______________________________________________
BLUG mailing list
BLUG@linuxfan.com
http://mailman.cs.indiana.edu/mailman/listinfo/blug

Re: [BLUG] Looking to study further in computer science

Comments below:

Ben Shewmaker wrote:
> when I was studying electronic music at the University of Miami, their
> big thing was teaching the fundamentals of digital/analog audio.
When I was at Purdue, all the computer engineers got the same basic
classes on electronics and semiconductors that the electrical engineers
got. The EEs got more semiconductors and analog/digital signals classes
later, and we moved to hardware design and systems programming once we
had a solid base.
> How do different types of synthesis work? What about MIDI?
When you understand how the underlying layers work, you can use them
more effectively. That applies almost universally.
> (and of course, many debates on why you just can't beat the sound of
> a true analog synth, like a Moog).
And many debates why you can't beat the audio quality and dynamic range
of vinyl?
> This leads me to another question: What are some of your favorite
> resources for programming fundamentals? Books, blogs, websites?
Wikipedia is a great start because it helps you know what to Google for.
I learned my C and C++ stuff from classes, but I learned PHP by Googling
around. For web development, w3schools.com is a great tutorial site for
the basics.
> Or perhaps I can also ask what are important fundamental concepts I
> should grasp? I am eager to start practicing in any number of
> different languages, but I really want to make sure I understand why
> things work the way they do. I don't want to end up a mediocre
> programmer, slaving away in Java day after day building ucky software
> because I didn't build a solid base.
You can write good code in Java, but it's a lot harder to do. I'm not a
fan of "easy" programming languages, because they let people get lazy.
Hypocrite that I am, I'm also a fan of Perl, which is often derided as a
"write-only" language.

Like I said before, I think everyone should learn C and write in it for
a while. If nothing else, it makes you appreciate the more modern
languages.
>
> Thanks again!
>
> Ben
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> BLUG mailing list
> BLUG@linuxfan.com
> http://mailman.cs.indiana.edu/mailman/listinfo/blug
>

_______________________________________________
BLUG mailing list
BLUG@linuxfan.com
http://mailman.cs.indiana.edu/mailman/listinfo/blug

Re: [BLUG] Looking to study further in computer science

For me it is books if I want to tackle a large topic like a new language or a framework. I
supplement heavily with blogs and websites.

For OO programming I would recommend any of Bruce Eckel's books (http://www.mindview.net/Books),
most of which are available for free or you can support his good work by buying them in bookstores.
Thinking in Java was an invaluable resource for me when I was learning both OO programming and
Java. He does a great job of explaining the fundamental concepts.

Josh


Ben Shewmaker wrote:
> Thanks for everybody who replied to my question, it was very interesting
> reading the discussion that followed. Programming languages, much like
> Linux distributions, have their own strengths and weaknesses and also
> come with their evangelists and detractors, it would seem. From what
> I've been reading here and elsewhere what language is used for any
> particular project can depend greatly on the problem to be had, the
> organization working on said problem and the preferences of the people
> working on the problem. I also liked what Jeffery said about
> fundamentals of programming. Perhaps it isn't that similar, but when I
> was studying electronic music at the University of Miami, their big
> thing was teaching the fundamentals of digital/analog audio. How do
> different types of synthesis work? What about MIDI? What are the
> basics of DAWs and how can you move from something like Pro Tools to
> Digital Performer? (and of course, many debates on why you just can't
> beat the sound of a true analog synth, like a Moog). There are
> multitudes of digital audio software packages out there and if you
> understand the fundamentals you can move between them. Sure, you'll
> have your favorite or maybe just one you've used so much that you can
> move around with ease, but if something new comes around that does
> something novel or useful, you can swtich over with a small learning
> curve.
>
> This leads me to another question: What are some of your favorite
> resources for programming fundamentals? Books, blogs, websites? Or
> perhaps I can also ask what are important fundamental concepts I should
> grasp? I am eager to start practicing in any number of different
> languages, but I really want to make sure I understand why things work
> the way they do. I don't want to end up a mediocre programmer, slaving
> away in Java day after day building ucky software because I didn't build
> a solid base.
>
> Thanks again!
>
> Ben
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> BLUG mailing list
> BLUG@linuxfan.com
> http://mailman.cs.indiana.edu/mailman/listinfo/blug
_______________________________________________
BLUG mailing list
BLUG@linuxfan.com
http://mailman.cs.indiana.edu/mailman/listinfo/blug

Re: [BLUG] Looking to study further in computer science

Thanks for everybody who replied to my question, it was very interesting reading the discussion that followed.  Programming languages, much like Linux distributions, have their own strengths and weaknesses and also come with their evangelists and detractors, it would seem.  From what I've been reading here and elsewhere what language is used for any particular project can depend greatly on the problem to be had, the organization working on said problem and the preferences of the people working on the problem.  I also liked what Jeffery said about fundamentals of programming.  Perhaps it isn't that similar, but when I was studying electronic music at the University of Miami, their big thing was teaching the fundamentals of digital/analog audio.  How do different types of synthesis work?  What about MIDI?  What are the basics of DAWs and how can you move from something like Pro Tools to Digital Performer?  (and of course, many debates on why you just can't beat the sound of a true analog synth, like a Moog).  There are multitudes of digital audio software packages out there and if you understand the fundamentals you can move between them.  Sure, you'll have your favorite or maybe just one you've used so much that you can move around with ease, but if something new comes around that does something novel or useful, you can swtich over with a small learning curve. 

This leads me to another question:  What are some of your favorite resources for programming fundamentals?  Books, blogs, websites?  Or perhaps I can also ask what are important fundamental concepts I should grasp?  I am eager to start practicing in any number of different languages, but I really want to make sure I understand why things work the way they do.  I don't want to end up a mediocre programmer, slaving away in Java day after day building ucky software because I didn't build a solid base.

Thanks again!

Ben