5
$\begingroup$

It's a known fact that computer science is inherently a tough field to grasp concepts because of its abstract nature and interdependency with lots of concepts at once.

What study techniques besides active recall, repetition(and those general study tips found in Ali Abdaal's youtube video) are useful to actually understand "tough concepts".

Some methods I've devised so far:

  • Start with exercises on textbook and study in order to solve them.

  • Study in Iteration Based Model. Example study chapter 1 in first iteration. Skip some topics. When you come back after ending the current iteration by studying every chapters to next iteration, you again study chapter 1's skipped topics.

What else novelty methods you follow? I find computer science too tough to "actually understand", easier to "bluff". The weird thing is that I am a Computer Science grad and I still feel lacking in "actual" computer science.

When I try to build softwares, write SQL, performance tune the system, develop games etc I always find myself coming back to the concepts of these subjects:

  • distributed systems, computing and algorithms

  • database management systems

  • operating systems

  • computer networks

  • network and web security

  • data structures and algorithms

  • computer graphics, linear algebra

  • artificial intelligence, neural networks

  • computer organization and architecture, embedded systems

etc. It bothers me a lot that I am not proficient in all of these things. I accept that these things are tough but I really want to learn no matter how much time it takes me. So I want to learn the study techniques for it.

For example: Today I was studying about 3d transformations(Guess which transformation is that? :D) and today I feel hopeless. This is not the first time I am studying about 3d transformations, I studied them in college few years back. Now, I am restudying computer science for my passion fulfillment.

I feel hopeless and feel that "I will never be able to learn", which is mainly due to my lack of belief in techniques to learn. I know this might be slightly off topic, but I want to note this point.

I love computers science and I've brought tons of books to study computer science, ranging from dbms, os, computer network, security, distributed systems, computer graphics etc. I recently thinking of purchasing a book on linear algebra as I feel math is the foundations for the most stuff in computer science.

$\endgroup$
7
  • $\begingroup$ Computer science is about the underlying math, not as much on what actual computers actually run. $\endgroup$ Commented Mar 10 at 19:13
  • $\begingroup$ @ThorbjørnRavnAndersen Any guidance available? I'm really passionate about CS because of its heavy usage in real life jobs. $\endgroup$
    – achhainsan
    Commented Mar 11 at 10:34
  • 2
    $\begingroup$ You are misunderstanding - computer science is about what is theoretically computable (Turing machines and complete etc), and not as much on how to do it (programming languages, databases, webservers). You may want to contact your local university to see if their CS department can help you with pointers to good learning resources. $\endgroup$ Commented Mar 11 at 10:52
  • 2
    $\begingroup$ @ThorbjørnRavnAndersen And yet Computer Science advertises itself as very much hands on if you look at CS departments. Boasting about their robotics team, or the cybersecurity group etc... So are the ways that CS departments across universities portray themselves a lie? And implying that they are more hands on then they really are? $\endgroup$
    – Questor
    Commented Mar 11 at 20:02
  • 2
    $\begingroup$ This is every CS department that I have looked at. From the community college to MIT, to Syddansk Universitet.. All of them advertise their CS degrees as teaching their student how to build something. make something... And then you talk to professors and they talk about how Computer science is the really about the theory of computation... And then you look at the code that Computer scientists at universities produce. And you realize why what they teach is the theory rather then the application. $\endgroup$
    – Questor
    Commented Mar 11 at 20:30

3 Answers 3

3
$\begingroup$

It's a known fact that computer science is inherently a tough field to grasp concepts because of its abstract nature and interdependency with lots of concepts at once.

I think computer science is tough for several reasons - but not necessarily because of its abstractness or the interdependency of many concepts.

An ill-defined and overly-general field

Computer science is an ill-defined field of modern vintage, that has arisen primarily so that academia can study and teach topics associated with the industrial and military application of computers.

Because a computer science curriculum doubles as a trade school for all kinds of professional roles in industry, there are many different demands made of it, which leads to highly general curriculums with teaching spread thinly, and with only smaller parts of the curriculum actually being relevant to any individual student/practitioner.

Courses would seem easier if more specific content was taught with an appropriate amount of time allocated, but then the course would no longer be "computer science" but something far more specific.

A field poorly understood by academia

The concepts and their relationships, and methods of teaching them, are still not really a settled "science" at all.

A large number of "styles" or "philosophies" of programming, for example, are often rooted in deep conceptual conflicts in the academic realm covered by computer science.

And although programming languages are typically covered by "computer science", few are willing to accept (for example) that the design or study of programming languages is at all "scientific".

Poor systems of teaching

Another problem is that professional practitioners who are also clear thinkers and excellent communicators, are often in market demand industrially, and this typically leads to a starvation of talent in teaching and academia where salaries and conditions have deteriorated over the decades, which then exacerbates the relative shortage of well-taught students amongst the next generation.

With poor pay and conditions, you then potentially end up with teachers and professors who are less suited to teaching this particular subject (and might even end up being drawn from backgrounds in adjacent fields of study, like mathematics, which are not full-square with computer science).

And many of the things first taught in university computer science courses, should probably be start to be taught to primary school children. You wouldn't expect to put a student on a university physics course who hadn't learned decimal arithmetic in school yet. You wouldn't expect to put a student on a university chemistry course who hadn't heard of the atom yet. Why should a university computer science course have to cover basic binary concepts?

Indeed, those who are effective as professionals are invariably self-learners, because there is a large amount of learning necessary relative to the small amount provided formally and effectively in school and university curriculums.

$\endgroup$
2
  • $\begingroup$ That's really a nice perspective. I never thought like that. Thanks. $\endgroup$
    – achhainsan
    Commented Mar 14 at 11:50
  • 1
    $\begingroup$ I agree with most of what you've written, and much of it seems like what you might expect in a relatively new and rapidly expanding field. As more types of computing degrees are offered, some of this will sort itself out over time, though I wouldn't expect to see any serious stability until the state of the field is relatively stable, and that may still be a long time coming. $\endgroup$
    – Ben I.
    Commented Mar 14 at 16:29
2
$\begingroup$

It sounds like you are interested in the untaught discipline of software engineering. Untaught because the only thing that comes close is a CS degree, and the average CS professors wouldn't be caught dead doing something so plebian as engineering.

One book I recommend is Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin.

It has a lot of good advice that will teach you how to write professional code with practices that future you/ people who work on anything you build/maintain will thank you for.

Computer programing, is not a science. It is (when done correctly) engineering. The way you get better at engineering is not by reading books on engineering (though they help). It is by practicing engineering, by building things, making mistakes, and learning from those mistakes.

You want to become a good programmer? Start programming! Don't however follow a programming tutorial. Instead use a tutorial to decide what you are going to make (so that you don't try to make something to complicated) and then build it without following a tutorial (Looking up and researching how to build individual pieces) This will teach you how to build/implement/use the building blocks so that you can reuse them on other projects... Instead of teaching you how to build a website that you can post pictures on, or whatever the tutorial was for.

$\endgroup$
0
$\begingroup$

Conflicting Approaches

As you described it, I see a huge conflict in your goals you want to achieve. It comes down to this:

  • I want to study or know (everything)
  • I want to be proficient or good (at everything)

The approaches are contradictory in nature and nobody would be able to achieve them.

Academia

In case 1 you stay at the theoretical level. You learn how to "understand" or "think about" computer science, what fields there are, what problems they try to solve, what algorithms there are, how to evaluate those and decide which algorithm is better than another etc. It is a very academic approach. Most likely you will never write one line of (compiling) code yourself, but probably lots of pseudo-code.

You will probably stay on your own during your study/research work. You might be in contact with undergrad students etc. You most likely will publish papers on various topics and be in loose contact (via email, letters) with other peers doing research in the same fields.

Programming

In the second case, you emphasis is the "doing" aspect. You want to be hands-on. Know your tools like the programming language, all their quirks inside and out, know about compiler options, the IDE, how to start writing code, how to read it, how to improve it, how to deploy it etc. You won't be able to know everything about every field of computer science. You have to specialize.

You will have to deal with a team of other developers probably who are also employed and have certain roles in your team (DB specialist, QA specialist, etc.).

"Everything"

The third important aspect to mention is the "(everything)" part. You can try to learn everything or to be able to do everything - but you will never be able to reach all these ideal goals. Let that sink in.

There is a process of specialization involved in both approaches. You can study broad, but at some point you will know in which topics to delve into more deeply, because of interests or maybe financial incentives.

You can also try to be good at everything, but you will quickly realize that this is impossible. The multitude of programming languages alone makes it necessary to specialize to a few of them. All the fields you mentioned are worth specializing into also.

It would be a huge waste of time and energy, to be for example, a game developer, but also know everything about haskell, R, AI, data mining, quantum computing, etc. - and also, one bit of that, is 3D transformations. You won't get to success, despite your broad knowledge. Although of course, having a broader/wide enough field of knowledge does help at times.

Chosing a Profession

So, if you like to be a teacher or professor, conducting research in the field of computer science, then I would recommend continue studying and reading books primarily. Maybe make some experiments with a programming language you want to use in your research or courses.

If you want to be a programmer, I strongly advise, find your field of profession early. Then intensify this field by practical means. Learn the relevant programming languages. And focus on reuse code that already solves the abundantly known problems of the field.

Meaning: Don't invent the wheel twice. If there is a graphics library that covers all the 3D-transformations for you - use it and go on to the next thing. Otherwise you will always be stuck at the basic level. Use StackOverflow to learn how others came to solutions. Use Copy&Paste. But also know what you are pasting there. Also learn what Refactoring is, what Unit-Tests are and how to write Clean, maintainable Code. Forget about most books and other fields of computer science, unless you need them specifically to solve your problem which has to be unique enough so nobody solved it already.

Time

Also, don't be fooled that you need to know everything in order to be a programmer or computer scientist. It is a process. Because you engage into the field of comp.sci and not for example into arts, politics or architecture, you are a computer scientist. You are at the beginner level also. But this does not mean that you won't get better at it. Give yourself the opportunity to evolve your skills over time. And with 50 or so, ask yourself again, if you are not a computer scientist or programmer.

PS: Quaternions? ;-)

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.