(Part 3) Reddit mentions: The best computers & technology books
We found 39,382 Reddit comments discussing the best computers & technology books. We ran sentiment analysis on each of these comments to determine how redditors feel about different products. We found 9,387 products and ranked them based on the amount of positive reactions they received. Here are the products ranked 41-60. You can also go back to the previous section.
41. The Art of Game Design: A Book of Lenses, Second Edition
- AK Peters
Features:
Specs:
Height | 9.5 Inches |
Length | 8 Inches |
Number of items | 1 |
Weight | 2.29942139266 Pounds |
Width | 1.25 Inches |
42. The Linux Command Line: A Complete Introduction
- No Starch Press
Features:
Specs:
Height | 11 Inches |
Length | 8.5 Inches |
Number of items | 1 |
Release date | January 2012 |
Weight | 2 Pounds |
Width | 1.09 Inches |
43. Game Engine Architecture
- Used Book in Good Condition
Features:
Specs:
Height | 9.25 Inches |
Length | 7.5 Inches |
Number of items | 1 |
Weight | 3.65085505872 Pounds |
Width | 1.75 Inches |
44. Game Engine Architecture
- AK Peters
Features:
Specs:
Height | 9.75 Inches |
Length | 8 Inches |
Number of items | 1 |
Weight | 3.89997741478 Pounds |
Width | 2.25 Inches |
45. The Practice of System and Network Administration: Volume 1: DevOps and other Best Practices for Enterprise IT (3rd Edition)
- Addison-Wesley Professional
Features:
Specs:
Height | 9.1 Inches |
Length | 7 Inches |
Number of items | 1 |
Weight | 3.34220789192 Pounds |
Width | 1.75 Inches |
46. Learning Python, 5th Edition
- O'Reilly Media
Features:
Specs:
Height | 9.19 Inches |
Length | 7 Inches |
Number of items | 1 |
Weight | 4.95 Pounds |
Width | 2.8 Inches |
47. Compilers: Principles, Techniques, and Tools (2nd Edition)
- O Reilly Media
Features:
Specs:
Height | 9.52754 Inches |
Length | 6.49605 Inches |
Number of items | 1 |
Weight | 3.2848877038 Pounds |
Width | 1.73228 Inches |
48. Web Design with HTML, CSS, JavaScript and jQuery Set
- Brand: Wiley
- Set of 2 Volumes
- A handy two-book set that uniquely combines related technologies Highly visual format and accessible language makes these books highly effective learning tools Perfect for beginning web designers and front-end developers
Features:
Specs:
Height | 8.999982 Inches |
Length | 7.200773 Inches |
Number of items | 1 |
Release date | July 2014 |
Weight | 6.03625673356 Pounds |
Width | 2.602357 Inches |
49. Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14
- O'Reilly Media
Features:
Specs:
Height | 11 Inches |
Length | 8.5 Inches |
Number of items | 1 |
Weight | 1.26986262912 Pounds |
Width | 0.76 Inches |
50. The Shallows: What the Internet Is Doing to Our Brains
- W W Norton Company
Features:
Specs:
Height | 8.3 Inches |
Length | 5.5 Inches |
Number of items | 1 |
Release date | June 2011 |
Weight | 0.55 Pounds |
Width | 0.8 Inches |
51. CompTIA A+ Certification All-in-One Exam Guide, 8th Edition (Exams 220-801 & 220-802)
- Used Book in Good Condition
Features:
Specs:
Height | 9.2 Inches |
Length | 7.5 Inches |
Number of items | 1 |
Weight | 5.42006471127 Pounds |
Width | 2.1 Inches |
52. The Algorithm Design Manual
Springer
Specs:
Height | 9.25 Inches |
Length | 7.01 Inches |
Number of items | 1 |
Release date | October 2010 |
Weight | 2.86160016076 Pounds |
Width | 1.69 Inches |
53. Real-Time Rendering, Third Edition
- New
- Mint Condition
- Dispatch same day for order received before 12 noon
- Guaranteed packaging
- No quibbles returns
Features:
Specs:
Height | 9 Inches |
Length | 6.25 Inches |
Number of items | 1 |
Weight | 3.95068373504 Pounds |
Width | 1.75 Inches |
54. Think Like a Programmer: An Introduction to Creative Problem Solving
- No Starch Press
Features:
Specs:
Color | Multicolor |
Height | 9.25 Inches |
Length | 7 Inches |
Number of items | 1 |
Release date | August 2012 |
Weight | 1.25 Pounds |
Width | 0.72 Inches |
55. Design Patterns: Elements of Reusable Object-Oriented Software
- The space mouse compact was developed to deliver an intuitive, effortless and precise 3D navigation in CAD applications that cannot be experienced by using a standard mouse and keyboard.
- Six-degrees-of-freedom (6Dof) sensor - intuitively and precisely navigate digital models or views. Operating system - Windows 10, Windows 8.1, Windows 7 SP1,Apple macOS 10.14, Apple macOS 10.13, Apple macOS 10.12, Apple OS X 10.11, Apple OS X 10.10. Linux Red Hat Enterprise Linux Workstation 4, 5, Linux Novell SUSE Linux 9.3, 10, 11
- Each of the space mouse compact's two buttons opens its own 3Dconnexion radial menu. They provide direct access to up to 8 of your favorite application commands.
- With its iconic, pure design, the space mouse compact is small enough to fit on every desk while the brushed steel base ensures the device stability for precise 3D navigation.
- 2-Year manufacturer's warranty
Features:
Specs:
Release date | October 1994 |
56. Patterns of Enterprise Application Architecture
- ✔ AMD FX-4300 3.80GHz / 4.0 Turbo Quad Core | 1 TB 7200RPM Hard Drive | AMD AM3+ 970 Chipset Motherboard
- ✔ 8 GB 1866 MHz Gaming Memory DDR3 with Heat Spreader | 24X DVD ±RW Optical | Genuine Windows Professional 10 64-bit
- ✔ GTX 750 Ti 2GB Graphics Card | 1 x DL-DVI, 1 x Display Port 1.4, 1 x HDMI 2.0b | 9 x USB (7 X USB 2.0; 2 X USB3.0)
- ✔ Wi-Fi Ready | No bloatware | Free Keyboard & Mouse | Monitor Not Included
- ✔ 1 Year Warranty on Parts and Labor | Lifetime Free Technical Support | Assemble in the USA
Features:
Specs:
Height | 9.4 Inches |
Length | 7.7 Inches |
Number of items | 1 |
Weight | 2.43831261772 pounds |
Width | 1.6 Inches |
57. Java Concurrency in Practice
- Addison-Wesley Professional
Features:
Specs:
Height | 9.2 Inches |
Length | 7 Inches |
Number of items | 1 |
Release date | May 2006 |
Weight | 1.51678036256 Pounds |
Width | 1.2 Inches |
58. C Programming: A Modern Approach, 2nd Edition
- TURNAROUND PUBLISHER SERVICES
Features:
Specs:
Height | 9.2 Inches |
Length | 7.5 Inches |
Number of items | 1 |
Release date | March 2008 |
Weight | 2.57499922016 Pounds |
Width | 1.1 Inches |
59. CCNA Routing and Switching Study Guide: Exams 100-101, 200-101, and 200-120
- Sybex
Features:
Specs:
Height | 9.25195 Inches |
Length | 7.448804 Inches |
Number of items | 1 |
Weight | 3.30693393 Pounds |
Width | 2.200783 Inches |
60. CCNA Routing and Switching Complete Study Guide: Exam 100-105, Exam 200-105, Exam 200-125
- Sybex
Features:
Specs:
Height | 9.200769 Inches |
Length | 7.40156 Inches |
Number of items | 1 |
Release date | September 2016 |
Weight | 4.19319222324 Pounds |
Width | 2.40157 Inches |
🎓 Reddit experts on computers & technology books
The comments and opinions expressed on this page are written exclusively by redditors. To provide you with the most relevant data, we sourced opinions from the most knowledgeable Reddit users based the total number of upvotes and downvotes received across comments on subreddits where computers & technology books are discussed. For your reference and for the sake of transparency, here are the specialists whose opinions mattered the most in our ranking.
📹 Video recap
If you prefer video reviews, we made a video where we go through the best computers & technology books according to redditors. For more video reviews about products mentioned on Reddit, subscribe to our YouTube channel.
Game Engine:
Game Engine Architecture by Jason Gregory, best you can get.
Game Coding Complete by Mike McShaffry. The book goes over the whole of making a game from start to finish, so it's a great way to learn the interaction the engine has with the gameplay code. Though, I admit I also am not a particular fan of his coding style, but have found ways around it. The boost library adds some complexity that makes the code more terse. The 4th edition made a point of not using it after many met with some difficulty with it in the 3rd edition. The book also uses DXUT to abstract the DirectX functionality necessary to render things on screen. Although that is one approach, I found that getting DXUT set up properly can be somewhat of a pain, and the abstraction hides really interesting details about the whole task of 3D rendering. You have a strong background in graphics, so you will probably be better served by more direct access to the DirectX API calls. This leads into my suggestion for Introduction to 3D Game Programming with DirectX10 (or DirectX11).
C++:
C++ Pocket Reference by Kyle Loudon
I remember reading that it takes years if not decades to become a master at C++. You have a lot of C++ experience, so you might be better served by a small reference book than a large textbook. I like having this around to reference the features that I use less often. Example:
namespace
{
//code here
}
is an unnamed namespace, which is a preferred method for declaring functions or variables with file scope. You don't see this too often in sample textbook code, but it will crop up from time to time in samples from other programmers on the web. It's $10 or so, and I find it faster and handier than standard online documentation.
Math:
You have a solid graphics background, but just in case you need good references for math:
3D Math Primer
Mathematics for 3D Game Programming
Also, really advanced lighting techniques stretch into the field of Multivariate Calculus. Calculus: Early Transcendentals Chapters >= 11 fall in that field.
Rendering:
Introduction to 3D Game Programming with DirectX10 by Frank. D. Luna.
You should probably get the DirectX11 version when it is available, not because it's newer, not because DirectX10 is obsolete (it's not yet), but because the new DirectX11 book has a chapter on animation. The directX 10 book sorely lacks it. But your solid graphics background may make this obsolete for you.
3D Game Engine Architecture (with Wild Magic) by David H. Eberly is a good book with a lot of parallels to Game Engine Architecture, but focuses much more on the 3D rendering portion of the engine, so you get a better depth of knowledge for rendering in the context of a game engine. I haven't had a chance to read much of this one, so I can't be sure of how useful it is just yet. I also haven't had the pleasure of obtaining its sister book 3D Game Engine Design.
Given your strong graphics background, you will probably want to go past the basics and get to the really nifty stuff. Real-Time Rendering, Third Edition by Tomas Akenine-Moller, Eric Haines, Naty Hoffman is a good book of the more advanced techniques, so you might look there for material to push your graphics knowledge boundaries.
Software Engineering:
I don't have a good book to suggest for this topic, so hopefully another redditor will follow up on this.
If you haven't already, be sure to read about software engineering. It teaches you how to design a process for development, the stages involved, effective methodologies for making and tracking progress, and all sorts of information on things that make programming and software development easier. Not all of it will be useful if you are a one man team, because software engineering is a discipline created around teams, but much of it still applies and will help you stay on track, know when you've been derailed, and help you make decisions that get you back on. Also, patterns. Patterns are great.
Note: I would not suggest Software Engineering for Game Developers. It's an ok book, but I've seen better, the structure doesn't seem to flow well (for me at least), and it seems to be missing some important topics, like user stories, Rational Unified Process, or Feature-Driven Development (I think Mojang does this, but I don't know for sure). Maybe those topics aren't very important for game development directly, but I've always found user stories to be useful.
Software Engineering in general will prove to be a useful field when you are developing your engine, and even more so if you have a team. Take a look at This article to get small taste of what Software Engineering is about.
Why so many books?
Game Engines are a collection of different systems and subsystems used in making games. Each system has its own background, perspective, concepts, and can be referred to from multiple angles. I like Game Engine Architecture's structure for showing an engine as a whole. Luna's DirectX10 book has a better Timer class. The DirectX book also has better explanations of the low-level rendering processes than Coding Complete or Engine Architecture. Engine Architecture and Game Coding Complete touch on Software Engineering, but not in great depth, which is important for team development. So I find that Game Coding Complete and Game Engine Architecture are your go to books, but in some cases only provide a surface layer understanding of some system, which isn't enough to implement your own engine on. The other books are listed here because I feel they provide a valuable supplement and more in depth explanations that will be useful when developing your engine.
tldr: What Valken and SpooderW said.
On the topic of XNA, anyone know a good XNA book? I have XNA Unleashed 3.0, but it's somewhat out of date to the new XNA 4.0. The best looking up-to-date one seems to be Learning XNA 4.0: Game Development for the PC, Xbox 360, and Windows Phone 7 . I have the 3.0 version of this book, and it's well done.
*****
Source: Doing an Independent Study in Game Engine Development. I asked this same question months ago, did my research, got most of the books listed here, and omitted ones that didn't have much usefulness. Thought I would share my research, hope you find it useful.
Sorry for getting all dramatic, but for me you're asking a red pill/blue pill question. I applaud your curiosity and can only recommend you follow your gut and take the red pill. The truth is by asking the question you already know what to do next. Just keep going. However I'll give you a few ideas because you got me excited.
OSX Terminal
Underneath the shiny GUI surface of your mac you have an incredible unix style OS just waiting to be played with and mastered. A few tips to get you going.
Download iTerm 2. Press cmd-return, cmd-d and command-shift-d.
Congrats. you now have a hollywood hacker style computer
Copy and paste this line into your terminal and say yes to xcode.
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Awesome you now have homebrew. A linux style package manager.
May as well get cask too.
brew install caskroom/cask/brew-cask
Now you can install programs by typing a couple of words.
try
brew cask install virtualbox
Get Linux ASAP
Linux is relatively easy to get up and running and awesome fun. try any of these options
If any of the above seems slightly daunting don't sweat it. Be confident and you may just surprise yourself at how much you can learn in such a short amount of time.
Learn the command line
The command line opens up the wonderfully powerful and creative world of unix. Push on.
Play, Play, Play
Do what gets you excited.
I got a big kick out of learning ssh and then pranking my friends with commands like
say hello friend, i am your computer. i think your friend two-gun is very handsome. Is he single?
or
open -a "Google Chrome" https://www.youtube.com/watch?v=X0uYvQ_aXKw
Do what you find fun. Oh and check out Richard Stallman. He's a good egg.
Enjoy.
edit-0
forgot iTerm link
edit-1
Wow! Gold! Ha! Thank you. This is so unexpected! I'd like to thank the academy, my agent, my mom...
A few of my favorite books I reference and recommend. Just a note, many of these are older and can be purchased used for much less. Also if you can afford it, get a Safari subscription. I use my work Safari subscription but this alone has saved me from my book buying habit. Now I only buy "must have" books. :)
Official Ubuntu Server book - I really like this book as the writing style helped me "get it" with Linux. Kyle Rankin has a very good method of showing you the technology and then a quick run down to get the server working, followed by some admin tips. It's a just scratching the surface type of book but it's enough to get you started. I rarely use Ubuntu now, but this book helped me understand DNS and other topics that were IMHO harder to grasp from other books.
As a bonus, this book also has an entire chapter dedicated to troubleshooting. While this sounds obvious, it's a great read as it talks about dividing the problem, how to approach the facts, etc. Stuff a seasoned admin would know but might be hard to explain to a new admin.
The Linux Command Line: A Complete Introduction - You can read this book for free on the site, but having a paper copy is nice. As mentioned, you should have a very solid understanding of the command line. In my experience, I have seen co-workers struggle with basic shell scripting and even understanding how to make a single line for loop. This book covers the basics, moving to shell scripting and I think it's a good solid reference guide as well.
DevOps Troubleshooting: Linux Server Best Practices - This book is referenced a few times here but I'll throw another comment for it. Another book from Kyle Rankin and has the same straight to the point writing style. It's very quick reference and simple enough that you could give this to a new sysadmin and he or she could get started with some of the basic tools. While the book covers a good selection of basic services and tools, it's easy to get deeper into a chapter and find it's only discussing a handful of troubleshooting steps. The idea with this book is it's a quick reference guide, and if you want to get deeper into troubleshooting or performance, take a look at other books on the market. Either way, this is a great book I keep on my desk or reference through Safari.
UNIX and Linux System Administration Handbook (4th Edition) - Another popular book based on the comments here. This is a pretty big book, thin pages, but it's like a small brick of UNIX/Linux knowledge. While it's starting to get dated, it does give a great reference to many topics in the system administration world. The chapters can dive deep into the subject and offer more than enough information to get started but also understand the technology. The e-mail chapter I thought was great as well as the DNS. I think of this book as a overall guide and if I want to know more, I would read a book just on the subject, that's if I need more information. One thing to point out is this book makes use of different OS's so it's filled with references to Solaris, different UNIX versions, etc. Not a problem but just keep in mind the author may be talking about something outside the scope of vanilla Linux.
Shell Scripting: Expert Recipes for Linux, Bash and more - I found this book to be a good extenstion of the Linux Command Line book, but there are many many other Bash/Shell scripting books out there. The author has many of the topics discussed on his site but the book is a good reference for scripting. I can't stress enough how important shell scripting is. While it's good to know a more formal language like Python/Perl/etc, you are almost certain bash will be on the machine you are working on.
Systems Performance: Enterprise and the Cloud - I can't comment on this book beyond the first chapter, I'm still reading it now but it's reading similar to Brendan Gregg's site, and that's a great thing. If you don't know who this guy is, he's one of the top performance guys in the Solaris and now Linux world. He has some great infographics on his site, which I use for reference.
Use method for Linux
Linux Performance
Example of Linux performance monitoring tools
Hope this helps!
Scott Meyers made Effective Modern C++ which has a lot of changes in the language documented and documented well. If you're proficient in C++ I highly recommend checking it out. (Or watch: https://youtu.be/xnqTKD8uD64)
The big one is ownership semantics leading to smart pointers.
The general rule of thumb is you should never use a raw pointer, except when you're not transferring ownership. Also, consider
weak_ptr
, and references, always references.SFINAE in class, really? I'm impressed. Use
constexpr if
instead when you can (90% of the time). SFINAE should really only be used for firmware and library engineers and is on its way out, if concepts ever get finished.Metaprogramming in C++? More like dark magic, taking advantage of C++17 plus SFINAE. No, I think you mean meta template programming, most likely. Meta template programming has been replaced with
constexpr if
as well. Don't do it, unless you like pranking your coworkers. You can write meta template programming to crashes IDEs when they try to read the file.>data structure/algorithms (arrays/linked lists/trees/maps/stacks/queues/searching/sorting/graph searches and efficiency considerations)
That's more data structures than algorithms. I personally think algorithms are more important, but I digress:
std::deque
is important, and no it's not a doubly linked-list. All the different hash and tree structures likestd::unordered_multiset
are super helpful to know, even if you never use them. Understanding sets and tuples too. None of this is specifically modern C++, except that most of these data types didn't exist or were incomplete 'till C++11. cppreference is super helpful and imho should be used regularly.Oh and C++ has a whole slew of algorithm functions and classes now. Check them out on cppreference, but imho they're not super helpful like they are in Python or R. Really, learning how to make an algorithm is more important.
Oh, I've been rambling about old stuff. Okay back to modern: the different kinds of bracket initializations are important. Previously initialization had a lot of () in it, so
auto foo = Bar(0);
, should that be a () or a {}? Looking at it I can tell you it most likely should beauto foo = Bar{0};
but it's not a guarantee. I'd have to look at Bar's source code to verify.There are modern idioms that should be considered, like aaa or almost always auto, and should be followed when possible and reasonable to do so.
Lets see, what else..
nullptr
instead of NULL. A lot of the pre processor can be replaced withconstexpr
andconstexpr if
.Ranges is definitely worth learning but that's a C++20ism.
std::expected
is super helpful to know but that's a C++20ism as well. (Just to know there are more ways to handle exceptions and which to use.)They teach perfect forwarding in classes you go to? What classes are you taking? That's impressive. I'd say
std::move
is super important to know and understand, but it's a given if you understand ownership semantics.Oh, there are new keywords.
default
anddelete
should be used liberally when creating a new class, in conjunction with the 0,3,5 idiom.override
is important on the inheritance front, and imho should be enforced using a compiler flag.Oh! Threading and file handling have had a complete over hall. Now C++ does it instead of using the OS' libraries. Threading is a bit of a sinkhole and should be known inside and out if you're working on your own project. If the project is large enough the framework should handle all of the threading for you. Otherwise, it is important. (eg, lockfree programming is kind of important in most situations.)
And of course lambdas. Super useful. No more
void *
. I can't believe I almost forgot them. Pass code around, not variables.RVO is important when considering ownership semantics. Basically, don't
std::move
on return unless necessary. Don't return a pointer or a reference unless necessary.Gosh there was something else..
Let's see, inheritance isn't taught right in any book or class I've seen. There is a prerequisite of understanding how to make types. This is important for quant work, because you'll probably be using custom types everywhere. Learning how to make them in C++ is important, not just use them, because it builds the prerequisite conceptual understanding for multiple inheritance.
Inheritance in Haskell terms is subtyping or abstract typing. Abstract classes (not necessarily fully abstract, just not concrete) are a type of class, sometimes called a subtype or abstract type. Inheritance isn't just for gluing code together. It's for having types of classes, or categories of classes. This is something understood on a senior level, but because it is so difficult to understand modern languages tend to just ban multiple inheritance out right. C++ has it, so understanding the thought process to not doing it right, but thinking about it right, is important.
I'm sure there is more. Oh, there is a new syntax Herb Sutter has been pushing which is pretty great, if the whole code base has it. .... and I can't find the video. The skinny is
int foo(double bar)
becomesauto foo(double bar) -> int
. The philosophy is the function name should be as far as possible to the left hand side to make code more readable, because types can get stupidly long sometimes. The C++98 equiv, which thankfully most of the code bases I've worked on do:int
foo(double bar)
Oh and
std::variant
combined withconstexpr
replaces unions.Basically, if it's in C there is a C++ equiv. Use that instead. The exception is native types, and functions. Even loops have changed to range based for loops eg
for(auto it : foo)
and withstd::for_each
, though C style loops are still useful and used sometimes. Oh and structs are still around and can be popular, butstd::variant
orstd::all
might be a better option depending on what you're doing.And the most important saved for last. Read http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines learn it, love it. For example, checkout F.15. Super helpful. This is official, so you can use it for coding disputes and what not.
phew \>.\<
> It’s hard to consolidate databases theory without writing a good amount of code. CS 186 students add features to Spark, which is a reasonable project, but we suggest just writing a simple relational database management system from scratch. It will not be feature rich, of course, but even writing the most rudimentary version of every aspect of a typical RDBMS will be illuminating.
>
> Finally, data modeling is a neglected and poorly taught aspect of working with databases. Our suggested book on the topic is Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World.
>
>
>
>
>
> ### Languages and Compilers
>
> Most programmers learn languages, whereas most computer scientists learn about languages. This gives the computer scientist a distinct advantage over the programmer, even in the domain of programming! Their knowledge generalizes; they are able to understand the operation of a new language more deeply and quickly than those who have merely learnt specific languages.
>
> The canonical introductory text is Compilers: Principles, Techniques & Tools, commonly called “the Dragon Book”. Unfortunately, it’s not designed for self-study, but rather for instructors to pick out 1-2 semesters worth of topics for their courses. It’s almost essential then, that you cherrypick the topics, ideally with the help of a mentor.
>
> If you choose to use the Dragon Book for self-study, we recommend following a video lecture series for structure, then dipping into the Dragon Book as needed for more depth. Our recommended online course is Alex Aiken’s, available from Stanford’s MOOC platform Lagunita.
>
> As a potential alternative to the Dragon Book we suggest Language Implementation Patterns by Terence Parr. It is written more directly for the practicing software engineer who intends to work on small language projects like DSLs, which may make it more practical for your purposes. Of course, it sacrifices some valuable theory to do so.
>
> For project work, we suggest writing a compiler either for a simple teaching language like COOL, or for a subset of a language that interests you. Those who find such a project daunting could start with Make a Lisp, which steps you through the project.
>
>
>
> [Compilers: Principles, Techniques & Tools](https://teachyourselfcs.com//dragon.jpg) [Language Implementation Patterns](https://teachyourselfcs.com//parr.jpg)> Don’t be a boilerplate programmer. Instead, build tools for users and other programmers. Take historical note of textile and steel industries: do you want to build machines and tools, or do you want to operate those machines?
>
> — Ras Bodik at the start of his compilers course
>
>
>
>
>
> ### Distributed Systems
>
> As computers have increased in number, they have also spread. Whereas businesses would previously purchase larger and larger mainframes, it’s typical now for even very small applications to run across multiple machines. Distributed systems is the study of how to reason about the tradeoffs involved in doing so, an increasingly important skill.
>
> Our suggested textbook for self-study is Maarten van Steen and Andrew Tanenbaum’s Distributed Systems, 3rd Edition. It’s a great improvement over the previous edition, and is available for free online thanks to the generosity of its authors. Given that the distributed systems is a rapidly changing field, no textbook will serve as a trail guide, but Maarten van Steen’s is the best overview we’ve seen of well-established foundations.
>
> A good course for which some videos are online is MIT’s 6.824 (a graduate course), but unfortunately the audio quality in the recordings is poor, and it’s not clear if the recordings were authorized.
>
> No matter the choice of textbook or other secondary resources, study of distributed systems absolutely mandates reading papers. A good list is here, and we would highly encourage attending your local Papers We Love chapter.
>
>
>
> [Distributed Systems 3rd edition](https://teachyourselfcs.com//distsys.png)
>
>
>
> ## Frequently asked questions
>
> #### What about AI/graphics/pet-topic-X?
>
> We’ve tried to limit our list to computer science topics that we feel every practicing software engineer should know, irrespective of specialty or industry. With this foundation, you’ll be in a much better position to pick up textbooks or papers and learn the core concepts without much guidance. Here are our suggested starting points for a couple of common “electives”:
>
> - For artificial intelligence: do Berkeley’s intro to AI course by watching the videos and completing the excellent Pacman projects. As a textbook, use Russell and Norvig’s Artificial Intelligence: A Modern Approach.
> - For machine learning: do Andrew Ng’s Coursera course. Be patient, and make sure you understand the fundamentals before racing off to shiny new topics like deep learning.
> - For computer graphics: work through Berkeley’s CS 184 material, and use Computer Graphics: Principles and Practice as a textbook.
>
> #### How strict is the suggested sequencing?
>
> Realistically, all of these subjects have a significant amount of overlap, and refer to one another cyclically. Take for instance the relationship between discrete math and algorithms: learning math first would help you analyze and understand your algorithms in greater depth, but learning algorithms first would provide greater motivation and context for discrete math. Ideally, you’d revisit both of these topics many times throughout your career.
>
> As such, our suggested sequencing is mostly there to help you just get started… if you have a compelling reason to prefer a different sequence, then go for it. The most significant “pre-requisites” in our opinion are: computer architecture before operating systems or databases, and networking and operating systems before distributed systems.
>
> #### Who is the target audience for this guide?
>
> We have in mind that you are a self-taught software engineer, bootcamp grad or precocious high school student, or a college student looking to supplement your formal education with some self-study. The question of when to embark upon this journey is an entirely personal one, but most people tend to benefit from having some professional experience before diving too deep into CS theory. For instance, we notice that students love learning about database systems if they have already worked with databases professionally, or about computer networking if they’ve worked on a web project or two.
>
> #### How does this compare to Open Source Society or freeCodeCamp curricula?
>
> The OSS guide has too many subjects, suggests inferior resources for many of them, and provides no rationale or guidance around why or what aspects of particular courses are valuable. We strove to limit our list of courses to those which you really should know as a software engineer, irrespective of your specialty, and to help you understand why each course is included.
>
> freeCodeCamp is focused mostly on programming, not computer science. For why you might want to learn computer science, see above.
>
> #### What about language X?
>
> Learning a particular programming language is on a totally different plane to learning about an area of computer science — learning a language is much easier and much less valuable. If you already know a couple of languages, we strongly suggest simply following our guide and fitting language acquisition in the gaps, or leaving it for afterwards. If you’ve learned programming well (such as through Structure and Interpretation of Computer Programs), and especially if you have learned compilers, it should take you little more than a weekend to learn the essentials of a new language.
>
> #### What about trendy technology X?
>
> (continues in next comment)
The first thing that I would say is: If you're thinking or making something bigger than a Pong clone, dial it way back. Your not going to make something fantastic, or Hell even good, straight out of the gate. Think of one idea that you have, and stick only to that. Make something very small, you can always build on it as you progress.
As for resources, they're limitless. There are tons of engines, assets, tutorials, book, and anything else you'd want. I'll make a small list of things here to get you started, but I strongly suggest looking for other things that you'd need on your own. Research and critical tinging is paramount in this hobby/profession.
Engines:
Art:
Music/Sounds:
Tutorials:
Books:
That's about all I can think of quickly. It should be enough to get you off the ground.
Have fun, and good luck!
Buying him computer hardware might be nice, but there's a lot of other ways to give something related to games and game design.
There's always a great big pound of dice. It's full of dice of assorted numbers of sides, and a game designer remotely interested in tabletop (which should be all of them) can use a healthy supply of dice for making tabletop games. There's always the fun of just rolling dice giant handfuls of dice.
I'm out right now but I'll add the link when I get back home.Here's the link: Pound of diceI'd also look into games he hasn't tried. BoardGameGeek has a lot of board games listed and reviewed that you could get, and of course there's always steam. For board games I'd recommend:
There's also a lot of books on game design you can get him. You may have to check to see if he owns some of these already, but I've found them to be great reads that I can recommend to anyone interested in game design.
You have a long journey ahead of you, but here goes :D
Beginner
C++ Primer: One of the better introductory books.
The C++ Standard Template Library: A Tutorial and Reference: Goes over the standard template library in fantastic detail, a must if you're going to be spending a lot of time writing C++.
The C++ Programming Language: Now that you have a good idea of how C++ is used, it's time to go over it again. TCPPL is written by the language's creator and is intended as an introductory book for experienced programmers. That said I think it's best read once you're already comfortable with the language so that you can full appreciate his nuggets of wisdom.
Intermediate
Modern C++ Design: Covers how to write reusable C++ code and common design patterns. You can definitely have started game programming by the time you read this book, however it's definitely something you should have on your reading list.
C++ Templates: Touches on some similar material as Modern C++ Design, but will help you get to grips with C++ Template programming and how to write reusable code.
Effective C++: Practical advise about C++ do's and dont's. Again, this isn't mandatory knowledge for gamedev, but it's advice is definitely invaluable.
Design Patterns: Teaches you commonly used design patterns. Especially useful if you're working as part of a team as it gives you a common set of names for design patterns.
Advanced
C++ Concurrency in Action: Don't be put off by the fact I've put this as an "advanced" topic, it's more that you will get more benefit out of knowing the other subjects first. Concurrency in C++11 is pretty easy and this book is a fantastic guide for learning how its done.
Graphics Programming
OpenGL: A surprisingly well written specification in that it's pretty easy to understand! While it's probably not the best resource for learning OpenGL, it's definitely worth looking at. [edit: Mix it in with Open.gl and arcsynthesis's tutorials for practical examples and you're off to a good start!]
OpenGL Superbible: The OpenGL superbible is one of the best ways to learn modern OpenGL. Sadly this isn't saying much, in fact the only other book appears to be the "Orange Book", however my sources indicate that is terrible. So you're just going to have suck it up and learn from the OGL Superbible![edit: in retrospect, just stick to free tutorials I've linked above. You'll learn more from them, and be less confused by what is 3rd party code supplied by the book. Substitute the "rendering" techniques you would learn from a 3d book with a good 3d math book and realtime rendering (links below)]Essential Mathematics for Game Programmers or 3D Math Primer for Graphics and Game Development: 3D programming involves a lot of math, these books cover topics that OpenGL/DirectX books tend to rush over.
Realtime Rendering: A graphics library independent explanation of a number of modern graphical techniques, very useful with teaching you inventive ways to use your newly found 3d graphical talents!
The resource seems very extensive such that it should suffice you plenty to be a good software engineer. I hope you don't get exhausted from it. I understand that some people can "hack" the technical interview process by memorizing a plethora of computer science and software engineering knowledge, but I hope you pay great attention to the important theoretical topics.
If you want a list of books to read over the summer to build a strong computer science and software engineering foundation, then I recommend to read the following:
The general theme of this list of books is to teach a hierarchy of abstract solutions, techniques, patterns, heuristics, and advice which can be applied to all fields in software engineering to solve a wide variety of problems. I believe a great software engineer should never be blocked by the availability of tools. Tools come and go, so I hope software engineers have strong problem solving skills, trained in computer science theory, to be the person who can create the next big tools to solve their problems. Nonetheless, a software engineer should not reinvent the wheel by recreating solutions to well-solved problems, but I think a great software engineer can be the person to invent the wheel when problems are not well-solved by the industry.
P.S. It's also a lot of fun being able to create the tools everyone uses; I had a lot of fun by implementing Promises and Futures for a programming language or writing my own implementation of Cassandra, a distributed database.
I've posted this before but I'll repost it here:
Now in terms of the question that you ask in the title - this is what I recommend:
Job Interview Prep
Junior Software Engineer Reading List
Read This First
Fundementals
Understanding Professional Software Environments
Mentality
History
Mid Level Software Engineer Reading List
Read This First
Fundementals
Software Design
Software Engineering Skill Sets
Databases
User Experience
Mentality
History
Specialist Skills
In spite of the fact that many of these won't apply to your specific job I still recommend reading them for the insight, they'll give you into programming language and technology design.
Good on you for looking to grow yourself as a professional! The best folks I've worked with are still working on professional development, even 10-20 years in to their profession.
Programming languages can be thought of as tools. Python, say, is a screwdriver. You can learn everything there is about screwdrivers, but this only gets you so far.
To build something you need a good blueprint. For this you can study objected oriented design (OOD) and programming (OOP). Once you have the basics, take a look at design patterns like the Gang of Four. This book is a good resource to learn about much of the above
What parts do you specify for your blueprint? How do they go together? Study up on abstract data types (ADTs) and algorithms that manipulate those data types. This is the definitive book on algorithms, it does take some work to get through it, but it is worth the work. (Side note, this is the book Google expects you to master before interviewing)
How do you run your code? You may want to study general operating system concepts if you want to know how your code interacts with the system on which it is running. Want to go even deeper with code performance? Take a look at computer architecture Another topic that should be covered is computer networking, as many applications these days don't work without a network.
What are some good practices to follow while writing your code? Two books that are widely recommended are Code Complete and Pragmatic Programmer. Though they cover a very wide range (everything from organizational hacks to unit testing to user design) of topics, it wouldn't hurt to check out Code Complete at the least, as it gives great tips on organizing functions and classes, modules and programs.
All these techniques and technologies are just bits and pieces you put together with your programming language. You'll likely need to learn about other tools, other languages, debuggers and linters and optimizers, the list is endless. What helps light the path ahead is finding a mentor, someone that is well steeped in the craft, and is willing to show you how they work. This is best done in person, watching someone design and code. Also spend some time reading the code of others (GitHub is a great place for this) and interacting with them on public mailing lists and IRC channels. I hang out on Hacker News to hear about the latest tools and technologies (many posts to /r/programming come from Hacker News). See if there are any local programming clubs or talks that you can join, it'd be a great forum to find yourself a mentor.
Lots of stuff here, happy to answer questions, but hope it's enough to get you started. Oh, yeah, the books, they're expensive but hopefully you can get your boss to buy them for you. It's in his/her best interest, as well as yours!
Hey there, I'm a game designer working in AAA and I agree with /u/SuaveZombie that you'll probably be better off with a degree in CS. BUT... don't give up on wanting to be a designer!
&nbsp;
You should realize that it's not giving up on your dream at all, in fact, it's great advice for how to reach that dream. A designer with an engineering background is going to have a lot more tools at their disposal than one who doesn't.
&nbsp;
Design is way more than just coming up with a bunch of cool, big ideas. You need to be able to figure out all the details, communicate them clearly to your teammates, and evaluate how well they're working so you can figure out how to make something people will enjoy. In fact, working on a big game often feels like working on a bunch of small games that all connect.
Take your big game idea and start breaking it down into all the pieces that it will need to be complete. For example, GTA has systems for driving and shooting (among many other things). Look at each of those things as its own, smaller game. Even these "small" parts of GTA are actually pretty huge, so try to come up with something as small as possible. Like, super small. Smaller than you think it needs to be. Seriously! You'll eventually be able to make big stuff, but it's not the place to start. Oh, and don't worry if your first game(s) suck. They probably will, and that's fine! The good stuff you make later will be built on the corpses of the small, crappy games you made while you were learning.
&nbsp;
If you're truly interested in design, you can learn a lot about usability, player psychology, and communication methods without having to shell out $17k for a degree. Same goes for coding (there are tons of free online resources), though a degree will help you get in the door at companies you might be interested in and help provide the structure to keep you going.
&nbsp;
Here's some books I recommend. Some are specific to games and some aren't, but are relevant for anything where you're designing for someone besides yourself.
&nbsp;
• Universal Principles of Design
• The Design of Everyday Things
• Rules of Play
• The Art of Game Design This and the one below are great books to start with.
• A Theory of Fun This is a great one to start with.
• Game Feel
• Depending on the type of game you're making, some info on level design would be useful too, but I don't have a specific book to recommend (I've found pieces of many books and articles to be useful). Go play through the developer commentary on Half-Life 2 or Portal for a fun way to get started.
&nbsp;
Sounds like you're having a tough time, so do your best to keep a positive attitude and keep pushing yourself toward your goals. There's nothing to stop you from learning to make games and starting to make them on your own if that's what you really want to do.
Good luck, work hard!
> Could you please go more in-depth on what you mean by seeing how the components work in harmony and understanding the needs of the different ones?
The absurdly short and easy for me response is:
https://www.amazon.com/Network-Warrior-Everything-Need-Wasnt/dp/1449387861
https://www.amazon.com/Practice-System-Network-Administration-Enterprise/dp/0321919165
The longer and more useful response would best be shared in a pub, assisted by frothy adult beverages of wisdom.
But, I'll give it a shot using the restrictive written word as a medium.
The CCNA certification will teach you the fundamentals of network design & configuration.
The MTA or MCSA certifications will teach you the fundamentals of Windows client and server design & configuration.
But what they don't tell you is when is a Catalyst 2960-series switch the right tool for a task, and what is something beefier like a Nexus 3K or 5K series device the more appropriate tool.
The driving factors behind appropriateness is in the details of the requirements.
Client devices (if we ignore WiFi) seldom have redundant network connections.
So laptops & desktops do not require redundant Layer-1/2 connectivity.
But all servers have, or should be equipped with redundant NICs, capable of some form of teaming configuration to form an active/active, or active/passive redundant team. The LAN solution must be compatible with this.
Then traffic volume. Client devices do not generally require frequent, sustained high volume network flows. Most client systems burst occasionally while they open a file, then settle back down to idle-chatter as they check e-mail every minute or so.
Some servers, like a DNS server receive never-ending, continuous bursts of small packet exchanges. Ass-loads of them. From thousands of source-addresses. Just a dozen packets in the conversation, which is then broken down and ended - conversation over.
Other servers, like a Hadoop cluster-member will chuck along fairly-quietly for short to medium periods of time, then engage in massive, sustained bursts of replication traffic or query exchanges.
Small, short conversations do not require extensive network buffering capability, and are not generally latency-sensitive. So general-purpose LAN hardware might be an appropriate tool for the job.
But very heavy workloads, or loads that ARE latency-sensitive (High Performance Computing, for example) might demand specialized network hardware designed for such activities.
-----
Beyond the network, one must understand the application workloads.
Some applications or systems might make ass-loads of DNS lookups.
A DNS query is not a complicated, or network-capacity intensive workload.
But if you know the application will be doing it, and will benefit from low-latency access to a DNS server, deploying an additional DNS server very close to the application might make a lot of sense.
-----
> There is one other school I have been considering. <AAS @ Green River>
I roll my eyes at the inclusion of CompTIA A+ material in a college curriculum.
That just strikes me as such a trade-school topic.
It's not bad material, but its like learning to change automotive oil as part of a mechanical engineering curriculum.
I see two Linux classes and two Network classes, so those things make me happy.
But I don't get a sense that this degree will transfer well.
I see things that should make you employable though.
The A+ cert won't get you a guaranteed job.
But the A+ and Sec+, combined with that array of associated educational topics should prepare you to hold your own in a reasonable interview.
Nothing is guaranteed, but that should be adequate.
-----
> How do you feel about a Business Degree with an (M)IS major vs a Bachelors of Science in Information Technology (maybe with a business minor)?
No objection from me on these degrees. Some of them do a better job of making sure you can see & speak-to the bigger picture, or higher altitude view of why these IT systems are important to the business.
IMO: Project Management is NOT an early-career role, but Systems Analysts, as players on a project team is certainly something early-career staff can perform.
> Do you think having a BBA would be detrimental for a career in technology?
Nope. knowledge trumps education.
> I hear some people say that MIS degrees aren't technical enough, or that they have a hard time finding a job after graduation.
Well, an MIS degree probably isn't technical enough for some job roles or position descriptions.
But an MIS degree with a CompSci minor might do the trick, for some roles.
But let's be honest, an MIS degree, all by itself is not the right degree for a position like "Lead Enterprise Architect for Mobile Application Development".
But an MIS degree, plus 9 years of experience developing software might be the right combination of education & experience for that role.
Let's also look at MIS v/s CS and IS/IT objectively, analytically.
Every single student in a college or university damned well knows that a CompSci degree is a fast-path to stable employment.
It's not quite a golden ticket for fame & fortune, but its among the most in-demand and immediately employable degrees available.
Employers & recruiters / placement agencies are actively searching for graduates that can survive a basic interview without drooling on themselves or sexually assaulting the recruiter.
There is a fixed and steady pipeline for CompSci graduates.
But CS includes a lot of big scary math, some of the biggest math requirements for any undergraduate degree track. And this scares away a lot of applicants.
A pecking order of "CompSci-light" degree options forms up, with these students all trying to get a degree that qualifies them to attend the Technology career fair, but protects them from evil math.
InfoTech, with it's focus on the nuts & bolts of operating systems, databases, networks & security proudly in a top-level tier beneath CompSci, and Computer Engineering. We rub elbows with Software Engineering grads who swear SoftEng is better, & more useful than CompSci.
InfoSystems, is watered-down InfoTech with more database and business-focus, and fewer nuts & bolts courses.
Management Info Systems is even more watered down technology material, with even more emphasis on business administration & data.
IS & MIS ARE useful degrees, and those roles ARE truly beneficial to the organization.
But the pipeline is smaller for those degrees within the Technology Career Fair.
But here is the fun fact for IS and MIS degrees:
They can attend the non-technology career fair if they want to.
IS & MIS might not have been highly in-demand at the technology career fair, but you have a whole different recruiting team with a completely different variety of slots to fill at the non-tech fair. IS & MIS starts looking much better & more attractive in this environment where they are actually hiring more project managers & analysts as opposed to developers & engineers.
-----
Some colleges, especially community colleges might only have a single career fair, but the concept still applies. MIS is valid for both technology and non-technical (less-technical) positions.
My Story
Hey pal, I was in a similar boat about 8 months ago. It was my senior year as an Economics major, and after taking a programming class, I instantly fell in love with it. I crammed a few more programming classes in before graduating, but in the end, I sure as hell wasn't employable as a software engineer.
&#x200B;
I had a choice: become a data analyst (the path I was currently on) or follow the software engineering dream. I chose the latter.
&#x200B;
I decided to go to a (remote) coding bootcamp after college. The program was 6 months. It taught web development (Node, React) and some very basic CS fundamentals. I spent my free time outside the bootcamp inhaling all the computer science and industry information I could. I did this because I wanted to be a competent programmer. I found it fun.
&#x200B;
This week I had my second onsite. I expect to receive a full-time software engineer offer (my second offer so far) later today, and I have 4 other onsites in the near future (a big 4 + a few startups). It has been a heck of a lot of work to get here, but if you want it badly enough, it's possible.
&#x200B;
My Tips
&#x200B;
Happy to answer any other questions you may have. I'm not an expert or an experienced software engineer yet, but I've walked the path you're considering, so hopefully my tips are helpful.
Welcome! You are showing great initiative in learning C++ and asking for feedback says that you are very serious about it!
A few words on your repository.
A few items on the code.
It doesn't compile out-of-the-box with gcc. I understand that this is just a practice project that you probably won't be officially distributing and supporting, but it never hurts to get in the mindset of cross-platform development early. For non-Windows environments, gcc is pretty much the de facto target compiler (others include clang, icc, and open64). Hence, it is well worth the effort to ensure you compile (preferably warning free!) under gcc. The errors were
vec3d.h
andquaternion.h
, you need to#include &lt;cmath&gt;
to usestd::sqrt
,std::cos
, andstd::sin
. You might need a preprocessor guard around the include since VC didn't have a problem with it. Additionally,&lt;cmath&gt;
gives youM_PI
so you don't have to#define
your own.I have no idea how this compiled in VC
vec3 getForwardVector()
{
return vec3(0, 0, 1) this;
}
inline vec3 operator(vec3 &v, quaternion &q)
{
quaternion result = quaternion();
result = q v q.conjugate();
return vec3(result.x, result.y, result.z);
}
When you say
vec3(0, 0, 1)
, you are generating what is known as an r-value (its name comes from the fact that it is usually something that is on the right of an assignment statement). You are passing this r-value into a function that expects an l-value (a thing on the left of an assignment statement). In general, this is not allowed (and for good reason!). What would happen in the following:void foo(int &i) {
i = 2;
}
foo(3);
The value
3
is a perfectly good r-value, but what happens when I executei = 2
infoo
? Badness, that's what. How can I possibly change3
to2
? I would break the universe. :p So it's just not allowed.However, there are two ways that you can pass an r-value to an l-value parameter. The first is through a
const
l-value.void foo(const int &i) {
// I can't change i because it's const!
std::cout << "i = " << i << std::endl;
}
foo(3);
The second is through what Scott Meyers calls "universal references." I need a slightly more complicated example to demonstrate this.
struct foo {
int x, y, z;
foo(int _x, int _y, int _z) : x{_x}, y{_y}, z{_z} {}
};
foo bar(foo &lhs, foo &&rhs) {
return foo(lhs.x+rhs.x,lhs.y,lhs.zrhs.z);
}
foo f{1,2,3};
auto x = bar(f, foo(4,5,6));
std::cout << "x.x = " << x.x << std::endl;
What does this print? 5 You can use either of these forms to fix your `inline vec3 operator
function. Notice that I didn't put
conston the first parameter. This was purely to demonstrate that
fis an l-value and doesn't require being called
constin the parameter list. However, it is good form to add
constto any l-value parameter that you are not intending to change. I *strongly* recommend a read through Scott's excellent book [Effective Modern C++](http://www.amazon.com/Effective-Modern-Specific-Ways-Improve/dp/1491903996/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1425771559&amp;sr=1-1&amp;keywords=scott+meyers). It is just chock full of great nuggets of wisdom like these.<br /> <br /> Wow. Another complete mystery as to why this compiles in VC (given what I just discussed, can you decipher the compiler error?)<br /> <br /> quaternion &amp;q = m_camera-&gt;getTransform().getRotation();<br /> <br /> &gt; invalid initialization of non-const reference of type ‘quaternion&amp;’ from an rvalue of type ‘quaternion’<br /> <br /> Does Visual Studio Express allow you to upgrade VC++ separately from VS iteself? If so, you need an upgraded compiler because this one stinks. Once you have mastered the art of l-value vs. r-value, you have lots of code to update as there are many errors surrounding this concept in your current code.<br /> <br /> While technically not an error, it is generally inefficient to pass primitive types by reference when you aren't going to be modifying them (the debate about using non-const references as in-out parameters rages to this day!). For example,<br /> <br /> static vec3 refract(vec3 &amp;I, vec3 &amp;N, float &amp;NdotI, float &amp;eta, float &amp;cos_t)<br /> <br /> should really just be<br /> <br /> static vec3 refract(vec3 &amp;I, vec3 &amp;N, float NdotI, float eta, float cos_t)<br /> <br /> Ok. Errors out of the way. How can you make your code more C++-y? I promise I don't intend to sound pithy, but the Java is strong with you. :p Let's take that previous example.<br /> <br /> struct vec3 {<br /> /* lots of stuff! */<br /> <br /> static vec3 refract(vec3 &amp;I, vec3 &amp;N, float NdotI, float eta, float cos_t)<br /> }<br /> <br /> In Java, this makes sense since you aren't allowed to have free functions. But this is C++ and we do have them and folks are going to anticipate you have them rather than class-static methods.<br /> <br /> struct vec3 {<br /> /* lots of stuff! */<br /> }<br /> <br /> vec3 refract(const vec3 &amp;I, const vec3 &amp;N, float NdotI, float eta, float cos_t)<br /> <br /> Much better! :D (NB: notice that I added
constto the input parameters? This is good form, too.)<br /> <br /> Alright. I think I have badgered you enough. Definitely keep us apprised of how the project evolves and don't be afraid to ask lots of questions!<br /> <br /> **EDIT**: fixed typos and added clarifications.<br /> <br /> **EDIT2**: Gave
struct foo` a non-default constructor so it will compile.EDIT3: Gold! Thank you, kind stranger.
I've been self-teaching myself C through various books/courses/series the last few months (I'm still not that great), and so I have some suggestions about good places to start learning.
Books:
Courses/Videos:
Resources:
Other than that, you should maybe look into trying out Linux, because it's more developer-friendly than Windows (such as having a C compiler out of the box). And the whole kernel and many core components of the OS are written in C, which are all usually open source, so you can learn from, and contribute to them.
Good luck, friend.
First of all, I wouldn't recommend learning game coding by looking at a codebase, the biggest reason being that all games are different and are using different techniques (obvious one being 2D vs 3D, but you have tons of differences between a FPS, a RTS, an open-world, etc).
I would recommend to find books or articles that explain why a certain technique is usefull, the coding language doesn't really matter, the technique itself is what is important (As you are saying it's for learning purposes and I don't think it's quite interesting to understand data-driven programming, cache optimization or 3D APIs optimization for C++ when you are first trying to understand a game structure).
I can recommend two really good books :
And website like Gamasutra have lots of good articles to look at. You can also look at HandMadeHero when Casey Muratori is explaining in details why he is doing what he will programming later on the show, his website is worth looking at too with some really good talks. Lot of good talks can be found at GDC, not all of them are free but a good portion are.
If you still want to learn only from codebase :
Happy game programming :)
EDIT : Fix format
EDIT 2 : Changed open source to publicly available sourcecode
Book suggestions? Now that's my jam.
Out of all the books i've read, here are my recommendations regarding game programming:
Eric Lengyel's Books (only one out so far). This is aimed at game engine development, but if the 2nd onward are as indepth as the first, they will be amazing fundamental knowledge. Also, they're not thick, and jam packed with information.
Game Programming Patterns. The only book that comes more recommended than this is the one right below it by Jesse Schell. This book is fantastic, but you should write one or two small games to really get the most out of this book. You can also read it online on his website free, but then you don't get a pic of him and his dog on the back cover.
Book of Lenses. This is your intro/intermediate dive into game design. There are a lot of game design books, if you only read one, it should be this one.
Gane AI By Example. This book is a hodgepodge of fantastic techniques and patterns by those in AAA. There are other books on the series (like Game AI Pro) which are similar, but in my opinion (at least when I read AI PRO 3), they're not as good. But more knowledge is never bad.
Truthfully, as I sit here looking over all my books, those are the only ones i'd consider mandatory for any seasoned developer. Of course plenty of developers get by without reading these books, but they likely pick up all the principles listed herein elsewhere, in bits and pieces, and would likely have benefited having read them early on.
Here are a few others that I do recommend but do NOT consider mandatory. Sorry, no links.
Unity in Action. Personally, I recommend this or a more interactive online course version (udemy.com/unitycourse) if you want to learn unity while having a resource hold your hand. Having read the book, taken the course, AND taken Unity's own tutorials on the matter, i'd order them in order from Course being best, book second, videos from unity third. But none of them are bad.
Game Engine Architecture. This is the king for those who want a very broad introduction to making a game engine. It comes highly recommended from nearly anyone who reads it, just so long as you understand it's from a AAA point of view. Game Code Complete is out of print and unlikely to be revisited, but it is similar. These are behemoths of books.
Realtime rendering. This is one I haven't read, but it comes very highly recommended. It is not an intro book, and is also over 1000 pages, so you want this along side a more introductory book like Fundamentals of computer graphics. Truth be told, both books are used in courses in university at the third and fourth year levels, so keep that in mind before diving in.
Clean code. Yeah yeah it has a java expectation, but I love it. It's small. Read it if you understand Java, and want to listen to one of the biggest preachers on how not to write spaghetti code.
Rimworld guy, Tynaan sylvester I believe, wrote a book called Designing Games. I enjoyed it, but IMO it doesn't hold a candle to Jesse Schell's book. Either way, the guy did write that book after working in AAA for many years, then went on to create one of the most successful sim games in years. But yeah, I enjoyed it.
Last but not least, here are some almost ENTIRELY USELESS but interesting diagrams of what some people think you should read or learn in our field:
https://github.com/miloyip/game-programmer
https://github.com/utilForever/game-developer-roadmap
https://github.com/P1xt/p1xt-guides/blob/master/game-programming.md
While being a self taught sys admin is great, learning the internals of how things work can really extend your knowledge beyond what you may have considered possible. This starts to get more into the CS portion of things, but who cares. It's still great stuff to know, and if you know this you will really be set apart. Im not sure if it will help you directly as a sys admin, but may quench your thirst. Im both a programmer and unix admin, so I tend to like both. I own or have owned most of these and enjoy them greatly. You may also consider renting them or just downloading them. I can say that knowing how thing operate internally is great, it fills in a lot of holes.
OS Internals
While you obviously are successful at the running and maintaining of unix like systems. How much do you know about their internal functions? While reading source code is the best method, some great books will save you many hours of time and will be a bit more enjoyable. These books are Amazing
The Design and Implementation of the FreeBSD Operating System
Linux Kernel Development
Advanced Programming in the UNIX Environment
Networking
Learning the actual function of networking at the code level is really interesting. Theres a whole other world below implementation. You likely know a lot of this.
Computer Networks
TCP/IP Illustrated, Vol. 1: The Protocols
Unix Network Programming, Volume 1: The Sockets Networking API
Compilers/Low Level computer Function
Knowing how a computer actually works, from electricity, to EE principles , through assembly to compilers may also interest you.
Code: The Hidden Language of Computer Hardware and Software
Computer Systems: A Programmer's Perspective
Compilers: Principles, Techniques, and Tools
Thanks, I share your feeling. The first time I visited this subreddit I was looking for similar posts. I wondered how people could combine Reddit with their busy life or how they would be able to indeed create stuff by at the same time consuming so much. I could not find any of this idea at that time and I just kept surfing until a few months ago when I started frequenting Reddit less and less.
In the meantime I did not stop thinking about it, read The Shallows by Nicholas Carr and wondered how people could combine all this easy, distracting input (Reddit, Facebook, just surfing in general) with bigger things that require no distractions or 'alone time', like reading, learning a new language, or in your case hoolahooping with fire. My conclusion was that you can't. If you want to go for it, you just have to go for it.
Of course you can combine Reddit with taking a test, but you can not combine it with finishing cum laude. I also realised though that this does not count for most people, they can combine these things, but they do not have the intention to become the new Einstein. It is a whole different discussion if this should even be a personal goal, but my idea was that these new Einsteins are so into the achieving of their dream that this would be really hard to combine with the great entertainment part of the internet and our society. It requires an opt-out, you will have to be an einzelganger at some times and that is exactly what what internet tries to prevent.
You worded this very well in your statement and I agree wholeheartedly. As you can see I'm still on Reddit but not for long. The past few months when I paid Reddit a visit I noticed that the lesser frequency of my visits also made me see the content better. And although I'm subscribed to a whole lot of interesting subreddits and described from all these fun things, I still noticed that I did not need all of this. It gave me a sense of passivity that I should not want in my life.
Nevertheless there are a lot pro-arguments to this website and I see that as well. Because I'm living in the Netherlands, I do not necessarily have to suffer some of the ills that the United States is made of. I can really understand that you need some inspiration of sanity if you live in a small conservative town where everyone is the personal friend of Jesus. So yeah, Reddit should inspire you, but maybe more as in a caravanserai. You meet a lot of new and interesting people, have a good night's sleep and travel on. Staying there also means that you will not arrive at your destination.
The people who say that you should do everything in moderation do not see that this is really hard for some people, but these are the same people that will give you some of the most interesting stuff. They can immerse themselves, lose themselves in Reddit or alike, but if they learn to use this energy in a more enduring way they can use it to write books, build houses or govern countries (just some examples).
In my view it works just like torrents. You have the seeders, who make things. They put in the effort. They show themselves once they finish their product. Their creations will surprise or disappoint. Then, there are the leechers. They wait. They need the seeders and they will criticize or praise the products of the seeder. Most of the time a seeder also leeches, but a lot of leechers tend to forget that they can also be seeders.
TL;DR: Reddit should inspire you, but maybe more as in a caravanserai. You meet a lot of new and interesting people, have a good night's sleep and travel on. Staying there also means that you will not arrive at your destination. Just like torrents, the society consists of seeders and leechers. The OP decided he wanted to be a seeder, I as well.
If you are going to be a one-man IT solution, your work will break down four ways, each of which are a specialty unto themselves and will require different amounts of your effort at different times of the year. I'm going to go into a bit more than reading material, because frankly, you should have some warning about what the future might bring.
All four will require setup, upgrade, and troubleshooting in event of breakdown or customer complaint. The exception here is that your other coast's IT department probably has an inventory system already in place, you'll just want to get to know it well. Also, learn all about how your company handles shipping (which shipper they use, how they charge, who has authority to approve shipping, etc) and what security rules are in place for storing company equipment and data.
In terms of Hardware, get and read just about any A+ book. It's going to be boring--I warn that in advance--but I've learned a ton of useful things from every A+ book I've looked at. The best one I've read is CompTIA's own A+ book because of how well put together it is, plus its written by the guy who writes the tests. There are a lot of things you may never use, but it makes a great reference, and your IT department might cover certification. Which becomes a great argument point for receiving a raise later.
As for Software... that will change based on every software package you ever handle. Ask the distant IT team if they have a knowledgebase, and if so, what it will take to access it. If they don't, compile yourself a bookmarks list for the forums of every piece of software you will use regularly. If its Microsoft software, Google will work just fine. The problems tend to be so widespread that answers will jump up. They won't always work, but it'll help you troubleshoot. Also find out how the company handles its software licenses. That can be a real headache.
Now the networking... That gets a bit more complicated. Depending on what your office is using for their network, it could be as easy as flipping power on and off on a few boxes hooked up to a broadband connection. If its more complicated, you'll want to learn about what solution is used for network administration. Good odds if its a major company that they'll be using Windows servers and Active Directory. Find out and learn about their account management solution. As for network hardware... you'll probably need to lean on the bigger IT team for awhile until you get comfortable with it. Proactively learn about routers, switches, domain controllers, DNS servers, and anything their Wikipedia pages link to that doesn't read like a Latin textbook. Most of your job won't be dealing with the theory, it will be trying to figure out where in the hose it is kinked, so that you can keep the Internet flowing and computers talking to each other. Learn about LAN cables and the different speeds, that'll help as well.
For inventory, well, hopefully that's all in place. If not, secure a locked space if one isn't already in use. Talk to whoever is in charge of your facility and at least try to get a secure closet with a lock. You'll probably want to request a small supply of replacement parts or whole computers, dependent on what your overall IT department uses as their policy. Find out if they lease the hardware, and track everything you receive, ship, or disburse in a log. Keep that log backed up somewhere really safe. Track inventory info, serial numbers, company designations (if they're tagging hardware), dates of activity, and notes on things like shipping numbers. This will save your butt often.
Good chance that for the first while, your job will be the same every entry level IT person ends up doing for awhile... You'll be someone else's hands. You'll have a problem, you'll try to fix it, you'll find out you can't or don't have privileges to do it, then you'll ask for help... then that person who would normally fly out to you will have you do the things on your end that they normally would, so they can finish things at their end. You'll be their hands in place. It can feel like monkey work, but eh, it can be a lot worse. You could be Migrating XP machines to Windows 7 for 3-10 months on 3rd shift, locked in a basement or storage unit. Folks all across North America have been enjoying that experience over the past 2-3 years.
OK, a few things:
It looks like you're trying to build a shift/reduce parser, which is a form of an LR parser, for your language. LR parsers try to reduce symbols into more abstract terms as soon as possible. To do this, an LR parser "remembers" all the possible reductions that it's pursuing, and as soon as it sees the input symbols that correspond to a specific reduction, it will perform that reduction. This is called "handle finding".
> If I am correct, my Automaton is a DFA?
When the parser is pursuing a reduction, it's looking for sequences of symbols that match the right-hand sides of the relevant (to our current parse state) productions in our grammar. Since the right-hand sides of all the productions in a grammar are simple sequences, all the handle finding work can be done by a DFA. Yes, the handle recognizer of your parser is a DFA. But keep in mind that it needs to be combined with other parts to make a full parser, and your actual grammar can't be recognized with just a DFA.
In particular, you've shown the
ACTION
table for a shift/reduce parser. It determines what to do when you encounter a symbol in the input stream. But a shift/reduce parser typically needs a second table as well - theGOTO
table - that determines what to do after a reduction has taken place.One other thing that's worth mentioning: you've expressed your
ACTION
table as a plain DFA transition table. That's not necessarily wrong, but it's not commonly done that way. Instead of reducing when you reach a certain state, it's common to instead attach an action - either 'shift' or 'reduce' ('accept') - to each transition itself. So in a shift/reduce parser, your table might look more like this:| [ | ] | < | > | id | / | attr
----+-----+-----+-----+-----+------+-----+--------
0 | S1 | | S4 | | | |
1 | | | | | S2 | | R3 : Reduce Tag -> [ id ]
2 | | R3 | | | | | R7 : Reduce Tag -> < id ??? / >
4 | | | | | S5 | S10 | R9 : Reduce Tag -> < id ??? >
5 | | | | R9 | | S6 | S8 R12 : Reduce Tag -> < / id >
6 | | | | R7 | | |
8 | | | | R9 | | S6 | S8
10 | | | | | S11 | |
11 | | | | R12 | | |
Note that
R7
andR9
aren't well-formed, since multiple sequences of input tokens might cause you to reach these actions. While it would be possible to construct a shift / reduce parser this way, it's not commonly done. Typically, the DFA to recognize handles is an acyclic graph, but your have a self-transition in state 8.> What would be the best way of implementing this automaton in C++? Do I really have to make a huge array?
In general, yes, you need a big array (or, as suggested before, two big arrays). But you can use any space-saving technique you want. For example, since most entries in the
ACTION
table are invalid, one could represent that data with a sparse array data structure. Also, both The Dragon Book and Cooper and Torczon briefly cover parser-specific ways to compress those tables. For example, notice that rows 5 and 8 in your example have the same entries. Most real grammars have multiple instances of identical rows, so factoring out this commonality can save enough space that the extra complexity is worth it.---
I'm a little surprised that you're building a parser like this by hand, though. Typically people do one of two things:
You're sort of doing a mix of the two, which means you have the downsides of both approaches. You need to track all the states and transitions by hand, instead of relying on tools to automate that process, yet you don't get the flexibility of a hand-coded recursive descent parser.
If you're doing this for education's sake, then by all means proceed. I'd highly encourage you to pick up a book on parsing; I think Cooper and Torczon is a great source. But if you just want a parser that works, I'd definitely recommend using a tool or using a more direct approach, like recursive-descent.
If you really want a book, there are a few that I've come across that I've liked and will suggest. Eloquent Javascript is a good one (it's free online!)
https://www.amazon.com/Eloquent-JavaScript-Modern-Introduction-Programming/dp/1593272820
Depending what you want to learn to do, also good:
https://www.amazon.com/Web-Design-HTML-JavaScript-jQuery/dp/1118907442/ref=pd_lpo_sbs_14_t_0?_encoding=UTF8&amp;psc=1&amp;refRID=YZ1P5N33ZRNPZG6SNM27
You just asked about books, but I would suggest unless you REALLY know you learn best by a book, I'd start with online tutorials (I liked Codeacademy) just to quickly get your feet wet. Codeacademy was a good way to learn the basic syntax you'll need. The books I've read, while great, tend to go deeper (not good at this stage IMO) than online tutorials which negate your "quickly" condition. Looking back, I didn't get a lot from the books until I was comfortable making code that did SOMETHING (and not much more) on my own. To me, that's the most effective way to learn quickly these days. It's easy to get sucked down a rabbit hole of feeling like you need to be an expert to start but looking back this is the plan that would have saved me a lot of spinning my wheels: 1st, do online tutorial (just 1 MAYBE 2); 2nd, then code SOMETHING (just to see you can make the computer listen to you); 3rd, When you feel like you can do something but don't understand exactly why or how it works THEN I'd get a book. That's when you'll get the most bang for your buck IMO. It's so easy to spin your wheels thinking you're one book or tutorial away from becoming an expert. It's cliche but the best thing really is to learn a little and then start making things. Take advantage of supportive programming friends or communities and don't be afraid to ask for help. You will learn more by making silly mistakes than if your code magically works the first time. Hope this helps!
My suggestions would be to augment it with other tools. It is a great book, but you want to study from more than just one source.
A couple of tips on preparing are as follows:
www.youtube.com/user/ccie12933 , TrainSignal and the like.
There are also some good places to find free study material. I will list a few here with what they provide...
http://www.freeccnaworkbook.com/ Free CCNA Labs
http://www.freeccnastudyguide.com/ Free CCNA Study Guide
http://www.ccnaskills.com/ Wendell Odom's Blog
http://www.ccnablog.com/ CCNA Blog
http://www.certificationkits.com/blog/component/wordpress/?cat=60 Blog of sample CCNA questions
http://ciscoiseasy.blogspot.com/ Cisco is Easy Blog
I hope all those resources help you in your studies and definately feel free to ask questions here on things you get stuck on.
Here's my general advice as someone in the AAA field as a programmer doing it for many years.
1 -----------------
If possible, think of your game in modular bits and primarily concentrate on the programming aspects. Block in the visuals with placeholder art if you need to, but a game with good design and mechanics doesn't need fantastic art to be fun (unless your game is animation driven or atmospheric like Dark Souls).
If you break your code into modular bits, you can tackle each part piecemeal and it's a lot more fun to work on. "This week, I feel like making a great input system. Next week, I'll focus on a data-driven AI engine", and so on.
2 -----------------
Keep things realistic. Understand what you can achieve and don't attempt to make a game that can do absolutely everything. Unless you actually want to spend decades making your game, you need to focus on actually finishing the game at a certain point... maybe. If your game follows the dwarf fortress model of being a perpetually unfinished game that you're always working on, that's also fun. Understand what you're getting into though if you go that route.
3 -----------------
Despite what you may think, ideas are not terribly original. It's all about execution. There's TOOOONS of indie games that are extremely successful and use an idea I had been thinking about. Unlike me though, they actually made the game and had the design sense to give it the production value necessary to sell well.
4 -----------------
If you're hungry to make something now, don't lose a hold of that. Keep learning in your spare time. Buy programming books off amazon to supplement your coding ability. I wasted too many years in university playing video games and not enough time learning to be a better programmer. A good high level starting book that can help give you an understanding of the overall picture is this: [Game Engine Architecture by Jason Gregory] (http://www.amazon.com/Game-Engine-Architecture-Jason-Gregory/dp/1568814135)
Just as you need to learn construction before you can build a house, you need to learn how to program properly before you can make a game. Keep focused and try to shorten the years you need to spend learning by reading books.
5 -----------------
most important unless you're working with a large team, don't worry about having perfect code the first time through. No matter what you do, it's not going to be correct. Try to do it to the best of your ability, but if you worry too much about clean code, you'll suffer from "perfection paralysis" and ultimately end up not finishing anything. This was another one of my mistakes when I was younger and I still catch myself doing it nowadays on occasion. Sometimes making mistakes is the only way to learn.
Don't be afraid to do things the wrong way first.
edit: grammar, added a link to a great book (no, I'm not the author)
Thanks for the great question! I'll answer the way my mother always answer my long emails...
I'm still not an expert yet, so I can't promise that my recommendation is the best path. Looking back at where I struggled and what worked for me, I'd say the best order to learn programming from the beginning is:
If I was helping someone start in programming, I'd have them go through the first chapter of Think Like A Programmer for basic problem-solving techniques, then Optional Bits – which my friend wrote – for programming basics, then Codecademy to learn the syntax of the language they're interested in (Treehouse is a good alternative if Codecademy doesn't have the language you want or if you learn better from video lessons).
Problem-solving is the best place to start because it's going to drive how you look at every program you write. Good problem-solving techniques also help build confidence, which is really important for a beginner – lack of confidence really held me back my first year of coding. I also found it easier to understand the different courses I took and books I read once I got a better grip on how to solve problems.
After that, learning programming basics should always come before learning a specific language. It makes learning new languages easier and, combined with problem-solving, helps you to understand how to put together a program together. If you can do that, then it doesn't matter which language you pick; the syntax is just filling in the blanks.
Learning a language at this point would just be figuring out what keywords the language uses – you won't have to learn both programming and language-specific syntax at the same time. A basic introduction like Codecademy is probably good enough for this step if you've filled in their blanks with the other steps first.
Then software design will help you learn things like OOP, coupling and managing dependencies, single responsibility, etc.
Again, I'm still in the early stages of programming myself, so I can't promise this is the best way to do it. In retrospect, I think that order would have worked a lot better for me when I first started. Hope it helps!
In almost every field, you're going to end up dealing with groups of things - lists of contacts, groups of users, categories of billing items, whatever. Having a deep understanding of arrays vs. (hash) sets vs. (hash) maps is huge, by far that's the most common decision I make on a day-to-day basis.
I think it's worthwhile to expose yourself to a bunch of specialized algorithms and data structures. You don't need to study them all super in-depth, but reading about them and maybe hacking them out in Python/Java/C++/whatever is a great learning exercise. I personally like "The Algorithm Design Manual" by Steven Skiena, (EDU PDF, Amazon). It's on the dry side, but it categorizes algorithms into a handful of types (sorting, graphs, combinatoric search, etc) which makes it great reference material for learning.
A handful of useful exercises, maybe useful:
Hello! /u/RageBill has already provided a great response, but I still wanted to add a couple of my own thoughts.
I would also suggest seeing if your highschool or university offers any computer science courses, and if so, sign up for the beginner class!
Best of luck!
Edit: most people will go back and forth all day on which language you should learn first, which are the most useful, etc. If you’re just starting out it can be easy to become overwhelmed with decision paralysis. If you’re just starting out you’ll want to pick a language based on how easy it is to pick up, and the level of support the community at large provides the language (how easy is it to find answers to problems on google?).
Especially if you’re brand new, the goal is to learn the basics and fundamentals and not necessarily wrestle with more advanced or “obscure” technicalities or concepts.
For these reasons (among others), the vast majority of entry level university computer science courses stick with python. If you google search the top ten most popular programming languages python is almost always on that list, along with Java.
I would recommend starting with python while you learn the basics and fundamentals of programming and computer science.
Of course these are just my thoughts and opinions and plenty of people will disagree. The point of what I’m trying to say is: don’t spend too much time debating which programming language to learn first, just pick one! You can always learn more later!
As other's have said, K&R is a great introduction to C, but not a great introduction to programming/computer science. I think more people should try to C as their first language as it gives the student a better idea of what the computer is actually doing than high-level languages. I wish I had a modern book I could refer you to for learning C as a first language, but I am out of the loop, however, I have heard great things about Harvard's free online course: Introduction to Computer Science which uses C (and some other languages).
As far as learning how to be a better programmer, I think one of the key things is to 1) strive to understand what is happening under the hood. 2) Break large problems into smaller ones 3) Logically order the operations needed to complete the tasks that solve the problem, 4) Learn multiple programming languages.
Some tips for becoming a better programmer
Strive to understand what the computer is doing when you execute your program
Understanding what the compiler/interpreter is doing with your source code, how the the processor executes the binary and how information is stored/accessed in memory will help you write more efficient code. The C language is great for learning these things once you start to wrap your mind around it. I would also recommend learning computer organization and hardware. One book I found that really helped me learn what a computer does is The Elements of Computing Systems: Building a Modern Computer from First Principles. I would recommend a casual reading of it, don't get too hung up if you don't quite 'get' it. Read it and see what sinks in. After you get better at C and maybe learn another language, come back to this book and read it again with closer scrutiny.
Break large problems into smaller ones. Logically order the operations needed to complete the tasks that solve the BIG problem
Before I write a single line of code I will spend days, weeks or even months just planning the program out. Flow charts and lists, pseudo code are your friend. Identify your large problem, think about all the different steps needed to get there, write them all down. Determine how to what you need to do to complete each step. Determine if you are doing the same task multiple times (I keep writing data to this log file, I keep checking to see if this array is full, etc.), if so, then you need a function for that. Write this all down as a human readable list of steps. Once you think you have solved the big problem, start coding the small stuff. Write small programs that complete each step you identified and test each little program. Once you've written all those little programs, put the pieces together. Check out How to Think Like A Programmer. It's an excellent book in this area.
Learn multiple programming languages
Again, stick with C until some things are really clicking for you. Eventually though you need to learn another language or two before the "thinking like a programmer" will really sink in. The more languages you learn, the easier it is to learn even more languages. You will begin to see the patterns in languages. You will notice the different approaches that different programming paradigms take. There is a reason that nearly every book, course or tutorial on learning a language follow very similar trajectory: What datatypes exist in this language? How to declare a variable of a particular type. How to output text to the screen, how to cast a variable to a different type, how arrays work in this language, how IF/Then/Else works, How loops work, etc. These are things (nearly) every language has and they are the first steps to learning how to work with that language.
Hope some of this helps!
I generally agree with the other replies that a vanilla computer science degree is better than a game degree, but let me use the example of the University of California Santa Cruz (UCSC) game degree to offer a balanced comparison.
At UCSC, the only difference with a computer science versus games degree is one class in the senior year. The fundamentals of both degrees are identical - you take the same math, physics, and programming in the game degree as you would in the CS degree. Only in your senior year does it differ, where as a games major you do a 1 year elective working on gaming group projects using Unity. If you did vanilla CS instead, you would use that year to take something like operating systems, artificial intelligence or databases. Deciding which one is a better fit for you partly depends on your philosophy of the purpose of school:
You can see this difference of philosophy being played out in not just the debate over a gaming degree program, but in things like the programming language of choice for first-year students, where some schools lean toward the practical (UCSC uses Java and C++) and some toward the theoretical (MIT traditionally used Scheme and now uses Python).
Specifically at UCSC, I would say the pros and cons are as such:
Pros:
Cons:
The first question you should ask yourself is whether the school you're looking at has a comprehensive undergraduate education and a good reputation, like UCSC, or if it's a specialized trade school like Fullsail or DeVry (stay away) with a bad reputation. Not all game schools are bad - both Digipen and Guildhall at SMU are notoriously challenging programs and in my experience working with a handful of their graduates, I found them to be quite competent. Allen Chou will be graduating Digipen with his first job at Naughty Dog (which was Naughty Dog's first time they've hired someone straight out of school rather than someone with industry experience, though it should be noted that Allen earned a previous bachelor's in electrical engineering before attending Digipen). And USC's game school is well known for having produced Journey developer thatgamecompany, among others.
As for the poor working conditions known at most gaming companies - yes, in general you will work more hours for less pay in the gaming industry than you would outside it. Yes, the industry is rife with constant layoffs. It is likely you will need to move all over the country and possibly world as you chase jobs throughout your career. It's up to you to decide if working on games and with other game developers is important enough to you that it's worth that sacrifice. Many people don't find it worth it, and they are not weaker for choosing another path. It's a personal decision of how much it means to you to work on games; alternatives are arguably more sane.
For working at the kind of companies you mentioned like Bethesda and Blizzard, you will need to be an expert at C++. Because C++ is such a large and complicated language to first tackle, I recommend learning C first. My book of choice is C Programming: A Modern Approach by KN King, which is also highly recommended in the C programming FAQ. Or if you prefer a shorter book, many people have learned from the C Programming Language by Kernighan and Ritchie.
For learning C++, there is only one book you need to know to start with: C++ Primer by Stanley Lippman, which is also the #1 recommendation of the C++ FAQ and highly reviewed elsewhere. You do not need to worry whatsoever about C++ becoming obsolete by the time you graduate. But you do have plenty to worry about mastering the language, because there is a lot of material to cover.
I'm a moderator at /r/TheMakingOfGames and I would recommend perusing some of the videos there that show behind the scenes of development companies (though arguably, the bright side of development). Some examples:
Depending on what you want to learn:
PYTHON SPECIFIC
You mentioned building websites, so check out the flask mega tutorial. It might be a bit early to take on a project like this after only a month, but you've got time and learning-by-doing is good. This'll teach you to build a twitter clone using python, so you'll see databases, project structure, user logons etc. Plus he's got a book version, which contains much of the same info, but is good for when you can't be at a computer.
The python cookbook is fantastic for getting things done; gives short solutions to common problems / tasks. (How do I read lines from a csv file? How do I parse a file that's too big to fit in memory? How do I create a simple TCP server?). Solutions are concise and readable so you don't have to wade through loads of irrelevant stuff.
A little while down the road if you feel like going deep, fluent python will give you a deeper understanding of python than many people you'll encounter at Uni when you're out.
WEB DEV
If you want to go more into web dev, you'll also need to know some HTML, CSS and Javascript. Duckett's books don't go too in depth, but they're beautiful, a nice introduction, and a handy reference. Once you've got some JS, Secrets of the javascript ninja will give you a real appreciation of the deeper aspects of JS.
MACHINE LEARNING
In one of your comments you mentioned machine learning.
These aren't language specific programming books, and this isn't my specialty, but:
Fundamentals of Machine Learning for Predictive data analytics is a great introduction to the entire process, based upon CRISP-DM. Not much of a maths background required. This was the textbook used for my uni's first data analytics module. Highly recommended.
If you like you some maths, Flach will give you a stronger theoretical understanding, but personally I'd leave that until later.
Good luck and keep busy; you've got plenty to learn!
Hey man. I'm currently doing what you are trying to do. I'm in my 4th-ish month now and having a blast. Right now I'm diving into javascript and I'm finding that that's where I'm having the most fun. Even though it's a fun time, I have to stay disciplined because sometimes I do fall off the horse. I try to make sure that I am studying 5 times a week 8 hours a day, but I don't always hit that mark. Pretty much trying to make it a full time job. I feel like I'm not quite job ready yet, maybe 2-3 months of learning and building projects. Thats the thing, just keep building websites. Here's a list of project ideas and follow FreeCodeCamp and do their challenges.
I recommend looking at FreeCodeCamp. Its free and they have a good curriculum and the best part are the Javascript challenges and mini projects they have you do and there is a pretty solid community and Gitter chat. Check out Jon Ducketts HTML & CSS and Javascript Books. Eloquent Javascript, from what I'm told, dives into JS a little deeper and I'm reading that currently. Lastly, I would also subscribe to something like Treehouse. It's $25 per month and they have a huge library of videos that are pretty good.
edit: I want to add also that there really are a ton of resources out there. So if one of the resources I suggested doesn't work for you, dont sweat it, you will be able to find another. But I do recommend learning from multiple resources instead of just leaning on one.
It can be kind of overwhelming diving into all of this stuff so please feel free to ask if you have any questions. Feel free to PM any time
Sure, like most people, I started with Python. I didn't start on codeacademy though, I started on program arcade games.
By the way, I should mention that at the time, I was a night manager at a Hostel so I got LOADS of free time to myself, and then when I got home I had even more free time so there was lots of time to practice.
In the first 3-4 months I learnt the basics of functions and classes and how to use them. After that time had passed, I dug deeper and bought Learning Python and read that a lot. I learnt pretty quickly about the cool things about Python like list comprehensions, anonymous functions (Lambdas), operator overloading, all that stuff. By the way, that book is not a beginner's book, it's a book on pretty much everything about Python
I kept programming in my spare time, I made a lot of crappy things and gradually my code got cleaner and easier to maintain. I made things that interested me, like a MIDI parser, a reddit bot that converts images to ascii Python C#, a bruteforce directory scanner and some other stuff. As you can see, I was pretty busy. This is what's important. By all means, do Project Euler and participate in Daily Programmer but don't expect it to nail you a job. That stuff is useful, but a lot of those are just algorithms, not programs that will impress the person interviewing you (who might not be technical in the first place).
Eventually I just sort of 'got' Python, and decided to learn other languages that interested me. For some reason, that was C. Choosing to learn C was a really good choice but at the time I found it too difficult so I gravitated towards slightly newer languages like C#.
When I started to think my programs had some sort of quality to them I applied for jobs. I looked at job listings and if I saw a requirement that I didn't have i.e. (Version Control) then I'd learn it.
The caveat with learning Python at the time, was that it left me pretty useless (bare in mind I live in Wales in the UK, not uber-progressive,technology wise). The majority of the listings wanted PHP, or VB.NET (yes you read right)
Eventually I got my lucky break with a duo of awful businessmen, they didn't know what they wanted and I didn't know how to deliver, but I tried and I learnt a butt-load as I tried to make their product. Their product was an entire website (frontend, backend and DB) that was to start off small and grow internationally, and they wanted it in 10 weeks... Needless to say, they didn't keep me on (surprise surprise) but with that experience I managed to nail a decent job with other developers using a similar set of skills. By the way that job with businessmen was in VB.NET, not an awful language but why not C#?
The new job is good, I create backends for websites, create frontends from photoshop files that are handled by our designer and I also create plugins for an in-house CMS (Think Joomla and similar stuff). This current position is in PHP, it has it's quirks - naming standards vary wildly, the $, foreach loop is backwards in syntax, -> instead of ., and a bunch of other stuff, but it's easy to use.
As it stands currently, I'm working on trying out different architectural patterns. The good thing about the position I'm in is that it's lots of small projects so I can do something new with each new project. Maybe I'll try a different design pattern, maybe I'll go MVP over MVC, I'm pretty much free to learn and do as I want since there is no codebase (well there is a codebase, but I can still try out new methods) for a module that doesn't exist.
TL;DR
Hopefully I answered what you wanted
TL;DR Improve yourself, invest in your future, don't worry about the mistakes...read the books listed at bottom, and practice!
Few months ago I royally fucked up an interview at Microsoft. A really simple question. But I had no experience doing coding on paper instead of a computer.
I spent a lot of time studying various books and paper coding to make sure it wouldn't happen again.
I then had an interview for another (in my mind at the time) dream job. I did fine for all the phone interviews and they flew me over to the west coast for an in person interview for the day. I did well for the first bit until they started pulling out dynamic programming and integer programming questions on me and expecting me. Once again something I didn't prepare for, and f'd up. Didn't get this job either. For the longest time I was really hard on myself at fucking up on both these interviews one after another. Especially this second one since a lot more was riding on it than just the job (another story).
But then I decided I didn't want to have this sort of experience again and expected better of myself. I made myself further improve and brush up on all those concepts as well. Did a few mock interviews with friends, spent some time working on interview type questions on both the computer and on paper. A month or two later I started interviewing again. By this point I was an interviewing machine - and I'm now able to do just about anything thrown at me. I've had my choice of employers and until just recently, was in the situation where I had so many offers I didn't know which one I wanted most. I'll be heading to silicon valley soon at one of the top tech companies in the world with a fantastic offer considering I just graduated.
The point is - learn from the mistakes and improve yourself. I realize you don't want to be that guy spending heaps of time coding outside of work or whatever... but this is an investment in yourself and your career. Do it once, and then just brush up on your skills from time to time. Get into the interviewing mindset and just rock them so you can have your choice of job - and then you can go about your thing once you have the job locked. The up front investment will be worth it!
Things that helped me:
Having trouble with Algorithm design/analysis? These are some of the go-to books for that:
If you've read the art of game design or a similar book, you'll find that in FTB, most of the fun is had through the problem solving.
You have to give problems to solve to the player, hard ones if you must, but you must not hinder the player in his attempts to solve it. The player should be as free as possible to solve your problems any way he likes
When the player finds a shortcut, he receives some instant gratification. As a developper, you may hate shortcuts as they cut content from the player's experience. But the short-term gratification can be worth it. Letting the player skip some of the game's content isn't dramatic. And this is what makes Minecraft's replayability.
# Feels good:
Problem solving
Feels bad:
Tediousness
Stopping me, breaking my inertia, by asking me to do some weird task
When you place a wall down my road and the only way to get past it is to jump, be careful, maybe I don't like to jump; add a window, a door, explosives, portals, anything.
Mixed feelings:
Alternately, when a mod relies too heavily on grinding and isn't automateable easily, it gets annoying. The grind isn't what's fun, the wait isn't what's fun, refining your machinery and scaling up your contraptions is where the fun is at.
The Stanford Algorithm book is complete overkill in my opinion do NOT read that book. That's insane. Read it when you've been doing programming for a while and have a grasp of how it even applies.
Here's my list, it's a "wanna be a decent junior" list:
&#x200B;
Reasoning: So, the first book is to give you a sense of all that's out there. It's short and sweet and primes you for what's ahead. It helps you understand most of the basic industry buzz words and whatnot. It answers a lot of unknown unknowns for a newbie.
Next is just a list languages off the top of my head. But you can pick anything, seriously it's not a big deal. I did put Java first because that's the most popular and you'll like find a mountain of resources.
Then after some focused practice, I suggest grabbing some SQL. You don't need to be an expert but you gotta know about DBs to some degree.
Then I put an analysis book that's OOP focused. The nifty thing about that book, is it breaks into design patterns nicely with some very simple design patters to introduce you to design patterns and GRASP.
Then I put in a legit Design Patterns book that explains and explores design patterns and principles associated with many of them.
Now that you know how code is structured, you're ready for a conversation about Architecture. Clean architecture is a simple primer on the topic. Nothing too crazy, just preps you for the idea of architecture and dealing with it.
Finally, refactoring is great for working devs. Often your early work will be focused on working with legacy code. Then knowing how to deal with those problems can be helpful.
FINAL NOTE: Read the soft skills books first.
The reason for reading the soft skills books first is it helps develop a mental framework for learning all the stuff.
Good luck! I get this isn't strictly computer science and it's likely focused more toward Software Development. But I hope it helps. If it doesn't. My apologies.
If you were serious about wanting some deep as-you-go knowledge of software development but from a Pythonic point of view, you cannot go wrong with following a setup such as this:
Mark Lutz writes books about how and why Python does what it does. He goes into amazing detail about the nuts and bolts all while teaching you how to leverage all of this. It is not light reading and most of the complaints you will find about his books are valid if what you are after is not an intimate understanding of the language.
Fluent Python is just a great read and will teach you some wonderful things. It is also a great follow-up once you have finally made it through Lutz's attempt at out-doing Ayn Rand :P
My recommendation is to find some mini projecting sites that focus on what you are reading about in the books above.
Of course this does not answer your question about generic books. But you are in /r/Python and I figured I would offer up a very rough but very rewarding learning approach if Python is something you enjoy working with.
Here are three more worth adding to your ever-increasing library :)
If you want a serious book recommendation: Learning Python 5th Edition by Mark Lutz. It's a monster at 1600 pages but to say it's thorough is an understatement. I got the ebook so I can quickly search through it on my phone. Even though I wouldn't consider myself a beginner anymore, I find between this book and the Python Cookbook I find answers to most of my problems (unless they're related to a library).
You can also read Learn Python the Hard Way (my introduction to Python 2). Which is free but not anywhere near the scale of Learning Python. As a warning, there's some coarse language used in it.
If you don't know any Python -- and this will probably stir the pot a little -- learn Python 3. BUT learn how to make it Python 2 compatible. Sure, you'll give up things like advanced tuple unpacking and
yield from
(to name two off the top of my head) and you'll probably have to use six but when the day comes that you can fully move your library to just Python 3, you'll be thankful.If you feel comfortable enough with Python to begin approaching a web framework, I would personally recommend Flask. I'm sure quite a few people would disagree and they probably make valid points. But Flask is easy to start with:
from flask import Flask
app = Flask(name)
@app.route('/')
def index():
return "Hello World"
if name == 'main':
app.run()
Miguel Grinberg (you'll see him float around /r/Flask and some of the other Python subs occasionally) has both a great blog series and a great book on building Flask projects. It's not the end all be all of Flask knowledge and honestly, I'd like see more written on working with bigger projects, but given Flask is only 4 years old I'm not surprised.
For Django, I've heard lots of good things about Two Scoops of Django but I've not read it (though, I need to at some point).
I'm unsure about other frameworks like Pyramid or TurboGears or WebPy.
You'll also want to have working knowledge of HTML (not hard), CSS and Javascript (much harder). And getting chummy with libraries like Bootstrap and JQuery/Angular/whatever is probably a good idea, too.
There's also specific concepts you'll want to be familiar with depending on where and what you work on: things like REST, JSON, Ajax, CSRF, etc.
This is just my 2 cents, but the first thing you should be asking when learning any language is what problem are you trying to solve with the language?
C# as a language doesn't amount to anything, but it's real potential comes from the frameworks it is associated with.
&#x200B;
If you're wanting to:
web develop then you would need to look into .NET Core + WebApi + MVC or a front-end framework (Angular, React, Vue).
This is a great course to get you started with. It'll create a basic web application you can modify and play around with from the database to the front-end:
https://www.pluralsight.com/courses/aspdotnetcore-efcore-bootstrap-angular-web-app
&#x200B;
desktop development then look at Wpf (window presentation forms) or use electron and c#
mobile development then take a look at xamarin
&#x200B;
from your use of Unity though, it seems as if you are more into game development which I would advise then to go a bit lower and really learn algorithms and good implementations. For this, there are some greats books you can use to help you get started:
Cracking the Coding Interview: 189 Programming Questions and Solutions by Gayle Laakman - Even though this is an interview book it's a great intermediate book to algorithms. The book does assume you have a basic understanding of elementary data structures.
The Algorithm Design Manual by Steven Skiena - This is definitely more advanced and heavy but it's a great book to really dig down into the nitty gritty
A great website for practicing writing algorithms in c# is leetcode.com. It's a site that basically lists a bunch of small questions you can solve with an in browser compiler that includes c#. This way you wouldn't need to download visual studio to practice coding.
if you're up for the challenege, then you can download a framework like SFML.Net and try to develop a game from the ground-up without using an engine like unity. But this is obviously a lot of work ;)
&#x200B;
Overall it's hard to give really specific advice without knowing where you're trying to head. But it's a good time to get into c# and in general microsoft's development stack. In the past people were shoe horned into using microsoft's technology stack from top to bottom but recently microsoft has made a lot of stride in making there tech more open which is making a lot of people turn heads.
If you are also looking for a more lite-weight ide then I recommend visual studio code or vscodium which is the same but without the trackers :)
> Felt pretty good about myself.. until I got to the algorithm section.
This is VERY normal. These are hard math concepts that take everyone a little bit to get used to. The only way you will learn these concepts is by implementing them, over and over and over and over and over.
> I would say I was getting stuck probably about half the time and would turn to read-search-ask method.
If this were not the case, then there would be no need to learn. I am a web developer and I look up the most inane shit on a daily basis because it is something that I either have never used/implemented or something I rarely use/implement (my big one here is PHP's array functions, I can never remember if the array comes before the callback or not with
array_map()
but I remember that it is the exact opposite ofarray_filter()
andarray_reduce()
). Embrace this, build your Google-fu because you will always need it.> A lot of times I was missing some small operator (code error) or somewhat minor step in the thought process, other times I would be lost entirely. Basically I wasn't thinking about how to implement my code well enough, imo.
This is 100% normal. Have you ever heard of a code review? This is where other developers review your code before it goes live. The point of this is that you cannot be 100% perfect with your code, maybe you forgot a semicolon or maybe your code is tough to read, that is what the code review process is like. I write code in iterations to make sure that I never 'get in too deep' and the fear of removing code sets in, each of these phases I go through a mini code review to see what is working at what isn't. I ALWAYS find some half-baked logic in my first few iterations before I really get into it and over the last couple years I find that I need fewer and fewer iterations and that I am able to get a better 'big picture.'
Don't be afraid to scrap some code and go back at it, this is your education and only you know when you understand the material. I have a bajillion abandoned side projects and so does every developer that I know.
Advice
Links
I did FCC up through the frontend section, I started my web dev career path in 2014 and picked up FCC in mid 2015 right before getting a job in web development. The most important part of FCC is that you are coding, getting practice and making mistakes, TONS of mistakes. Just keep it up, don't get burned out and remember that it is about your education, not how many challenges you complete. Code and read and read code.
Don't be suckered by a "Game Design" program. There are VERY few good ones. Most of them....as in, 99% of them...are rip-offs.
Learn programming, 3D-modeling, or animation. Pick one that you're more interested in and then full-speed ahead. These will make you useful in more than just game development roles, thus helping you in the future when you have trouble landing a game dev job. At least you'll still be doing something you like in the meantime, and still building your skill in that area. Many really popular game designers have specialties outside of just "Design". Some are excellent programmers, some are artists, some have excellent business skills (really good at project management), and some are brilliant story-writers. Most game design positions are not entry-level, because you REALLY have to know what you are doing, before someone will trust you enough to let you touch the design. The only real way to prove that you are actually a good game designer is by having games to show off. That proves that you have some idea of the design process and know how to maintain a game from start to finish. This is HARD.
Some like to say that these degree programs for game design help them by giving them the incentive to push through and finish their stuff, otherwise, they might not have the motivation. Well, that's very problematic, because that means that you will not be the type of person who can finish a game. Game development requires you to be highly self-driven.
Most of what "Game Design" programs teach you can be learned by picking up a few game design books and making your own games (alot of them, too). Game design is learned by making games, not by having a professor tell you about it. You have enough mentors in the game development community already. They will always be there to critique what you do and give you tips on how to improve your work. Pick up a couple of books like The Art of Game Design and Designing Games. You can look at other books in whatever other area you want to master and just get started on making games. Turn off your console and just get started. Start small. Make very simple, basic games to start off with (B.A.S.I.C.). It's about learning the process first. Do that while reading a ton of highly-detailed game postmortems online. Just learn the process. THAT will be your real education.
And finally, start working your way up to putting together a portfolio. Portfolios speak much louder than a resume (although, a resume is still important). And that doesn't mean having a bunch of "Game Design docs". Games. Not docs. Games. Then build up your confidence and hook up with a team, so you can fight your way together to the end of making a complete game. (this may be one of the only valuable things that a game design program can provide you out of the box, i.e., a team that you are forced to work on a game with)
The single most important tool you will ever have is discipline. No degree will be able to top that. Give up the idea of being a hardcore gamer, because you are now going to need to become a VERY disciplined person. You're going to need it.
Finally: Don't forget to have fun. Good luck! :)
I'll be honest with you, I don't think Head First Java would be a good choice, however DO READ Clean Code. I also suggest Design Patterns: Elements of Reusable Object-Oriented Software and Working Effectively with Legacy Code. The first is a classic MUST READ for anyone in software development. It present numerous challenges that most of us will face when developing solutions, and gives you the design patterns you will need to solve them. The second is great for learning how to fix your predecessors shitty code, you'll need this one. If you haven't already, look up Bob Buzzard and Andy Fawcett. These two guys are my favorite SFDC Dev Bloggers. I also suggest watching any Salesforce Webinar that has anything to do with code, especially security stuff.
Practice makes perfect, except for us there is no perfect, just better. Know your best practices and live by them. With everything you do ask how can I make it better? Faster? More efficient? Do I even need code, or will Workflow/Process Builder/Flow do? How can I write code, so that an Admin can customize it without any code?
> Based on code reviews--my code is pretty good, with good logic and pretty well laid out.
This is actually VERY important, having good logic is obviously crucial, but being well laid out is a kind of hidden requirement with code. You or somebody else will eventually need to maintain your code, if it's laid out well it should hopefully be easy to read and maintain.
When you write code do your best to incorporate declarative features so that further customization can be done without code (I know I said this earlier, but I think it's important). Need to write some code that uses an arbitrary set of fields, consider using Field Sets. An Admin can add/remove them without code. Maybe use a Custom Setting, or Custom Metadata to map fields to values.
Learn how to use Describe calls for everything. Need to write some code that catches dupes and merges them? Don't hard code the values, then nobody will be able to remove or add fields without updating code. Instead use Describe calls, now you get every field on the object forever. Need to remove a field from an object no problem. Need to add a field to an object no problem. Does your losing record have child records that need to be reparented? Don't hard code, use Describe calls to get all sObjects with a Child Relationship. Use Describe to find out if it can be directly reparented or if it needs to be clones (CampaignMembers can't reparent a LeadId to a new Lead. You MUST clone and add the new Lead Id).
How much do you know about HTML? CSS? JavaScript? JQuery? Visualforce? Learn 'em. Lightning is coming, and these are going to be more important than ever (except maybe Jquery).
Practice, practice, practice. One coding assignment per month isn't that bad, but if you get some work done early and you have an hour or two to spare, work on a side project. Can you think of something in your company that could be automated, spin up a Dev Org and give it a shot. Maybe your Sales people could use a new VF page for entering information just a little quicker.
Always seek to improve your code. Always seek new ideas and better ways of doing things.
Trailhead is good, do all the coding ones you can find, it's more practice!
Students of networking are often really excited and anxious so they don't notice this as they stumble upon this subreddit, but this question gets asked almost every other day. I will just copypasta and edit a little of what I posted earlier today.
First, don't take the composite. Do you like money? You will probably fail at least once. I failed my first time. Goodbye money. Goooodbye pride. Helloooo shame. Take the ICDN1 and then ICDN2.
Here is the current blueprint for ICDN1 It is meant to be followed from top to bottom as the first topics are fundamentals, working its way down to switching and then routing.
I recommend getting a SafariBooks subscription. It even has a free trial. The Livelessons videos are over $100 retail and the Odom and Lamlee books are another $100. For $39 a month I think SafariBooks is the best value.
Then on SafariBooks, search for CCNA Livelessons videos [specifically "CCENT ICND1 100-105"] on ICDN1. Kevin Wallace goes through the blueprint from top to bottom and I just think he is a very focused and excellent instructor. He has another video series there called "Learning Path: CCNA Routing and Switching" which goes off the blueprint slightly into a deeper understanding of networking fundamentals. Disclosure, I have not watched the new exam videos since the exam was revamped last year, but I did watch his videos from the last exam version.
Supplement your learning by reading the Odom and Lammle books on ICDN1 which are also available on Safaribooks. You can even download the books for offline reading on your phone or tablet. Some like Odom's official cert guide more but it is dry material that follows the blueprint. Lammle is a little more 'colorful' but I don't like his prose and how he gets off topic with real-world scenarios. There are also some cram guides that have quizzes and good commands to know. Again, all of these are available on SafariBooks. ^I ^am ^not ^a ^shill ^for ^SafariBooks ^but ^I ^use ^it ^almost ^everyday.
For additional studying you can get some pre-made Anki or Quizlet decks. They both have mobile apps [Anki is not free. Quizlet is] and are super helpful when you don't have the ability to open a large book or watch videos...or don't have the attention span to re-read a chapter.
When you want to touch 'real' equipment you can download Packet Tracer for free from Cisco Net Academy. Dan's Courses has step-by-step Packet Tracer labs and solutions. Labbing is essential but you definitely don't need a physical lab for CCNA and especially ICDN1. You eventually can graduate to GNS3 but you should only need PT for ICDN1 and probably ICDN2.
Lots of people like CBT Nuggets but I find that since they don't follow the blueprint very well and the presenter Jeremy Cioara gets off topic [I.E. excited] and can throw off focus of the subject matter. Also at something like $100 a month [legally], it is expensive for what you get in return, which is one video series with some large holes in the knowledge you need to pass.
I learnt from these 2 books
Web Design with HTML, CSS, JavaScript and jQuery Set
https://www.amazon.co.uk/dp/1118907442/ref=cm_sw_r_cp_api_i_Y1MQCbH3QGBW6
I highly recommend them, they aren’t really tutorials on how to code but goes into excellent detail on everything you need to know. They do include code examples and website concepts such as design, how to structure, ease of use etc...
If you want to progress from this, you can start looking at databases and collecting user data etc... the PHP practice is a bit outdated but it is a very good tutorial book to get started
PHP & MySQL In Easy Steps
https://www.amazon.co.uk/dp/1840785373/ref=cm_sw_r_cp_api_i_C7MQCb9JHJP5G
I’m also hoping you’ve came across w3 schools at some point but just incase you might want to have a look at this website as well, it’s great for information all website related
https://www.w3schools.com
This was my path and I’ve done 2 courses of web design at uni and there isn’t much more they were able to teach me that I hadn’t already learnt from those books. Obviously a bit more advanced stuff but tutorials and resources are always available online for that.
If you have anymore questions don’t be afraid to ask! Like I said I’m still a student who self taught all this and it’s not my job but I hope it will be in the future for me too, so hopefully a professional might be able to offer you better advice :)
If you're planning on pursuing this as a career, there are tons of incredible opportunities for people experienced with lower-level 3D APIs. Making your own engine serves as a fantastic learning experience, and would be a huge investment in your future.
Below are some of my favorite books/resources right now that may help you along the way. These might not be immediately useful to you right now, depending on where you're at, but together they have more than enough knowledge for you to go far in 3D Computer Graphics.
The correct answer to:
Q. Should I learn C or C++ first?
Is:
A. Yes.
WARNING: Highly Opinionated Analysis of C vs C++
I see a lot of people recommending one way but no one offering an analysis of BOTH the Pro's & Con's.
I've been using C++ since ~1990. I've briefly worked on a PS3 C++ compiler when I worked for Sony. I've seen 2 major problems over the years with C++ programmers:
1. People don't exercise discipline and restraint in K.I.S.S.
They use (and abuse) every language feature because they can. There is this tendency to over-engineer even the simplest things. Take a look at this complete clusterfuck of CRC in the Boost library.
1109 lines of over-engineered C++ crap for a simple CRC32 function instead of a mere 25 lines of code!?!?! The C version would:
The trade-off would be is that it is less flexible, but WHEN was the last time you needed to use a custom CRC polynomial!?!? One would instead use a different algorithm such as MD5, SHA, etc. that:
This excellent SO on hashing is but one example of focusing on the big picture.
2. People lack a basic understanding of the cost let alone the implementation of C++ expressions.
I've seen people stick a virtual function inside an inner loop and wonder why their performance is crap. I've seen people fail to grasp a basic understanding of pointers. I've seen people not understand memory management and how to guarantee zero memory leaks. I've seen people spend more time on writing an "über" template and waste hours debugging that instead of just writing something in 1/10 of the time and move on.
IMO, due to the bloated, over-excessive verbose nature of C++ it is for these reason that I strongly recommend a beginner learn C first and then learn C++. You'll have a better understanding of why C++ is designed the way it is, what the design trade-offs are/were, what C++ hacks are, and how to best use the languages to their potential.
However, this is ignoring the benefits and disadvantages of the Pro's/Con's of why one would learn C++ or C first.
Learn C++ first
Learn C first
{
{
With that said there are numerous C++ books I would recommend to ALL C++ programmers. They are sorted from beginner to expert:
If you can get only one book, get the The C++ Programming Language.
Even though Bruce's book is ancient he keeps it simple and is a fun easy read. Remember this is before C++98 where the language is much simpler.
You can find it online for free
Lastly, just because you can, doesn't imply you should. Use balanced C++ and you'll be fine.
I think C++ Primer is nice, and I still keep it around at work as its a useful reference to have. Being able to open up to a section about a topic and know I'll find some reference info, example code, and some good exposition is great. It covers C++11 fairly well, too. Make sure to get the most recent edition. The book does a nice job of providing a decent amount of example code, and the included exercises are very useful.
Effective Modern C++ is great, once you have a bit more experience under your belt. I pull this one out all the time to take a quick look through it when I question how I'm using some feature, and the paradigms of "Modern C++" in general are just great to follow and fun to use.
The C++ Programming Language is a reference guide: its good for more advanced programmers who want a quick reference guide that also has a bit of exposition on various concepts/features (beyond what can be found on cppreference). I still don't think it would be well suited to you- it lacks the example code and useful exercises of the C++ Primer.
As you probably well know though, the best way to learn a programming language is to write in the language. Books are good for making sure you don't do outright "bad" things at first, and in that case I'd definitely recommend the C++ Primer. I had the problem of following online sites for my first C++ experiements, and these sites never used or mentioned any of the wonderful things C++ offers like the
algorithm
library (learn to love everything that offers!) or even something as basic asstd::vector
! Instead, I was using lots of raw calls tonew
anddelete
and doing other suboptimal things.So, I'd say go with C++ Primer to start. Follow along like you would with a maths textbook and do the example problems, and transcribe and run much of the example code yourself.
Effective C++ would be next, to help you brush up on using various features of Modern C++ and better understanding small but vital details like
constexpr
and move semantics.I started learning C++ in August of this year, so I still remember a lot of what it was like to start. Feel free to ask me more if you have any questions about other materials, websites, or resources.
In addition to what others have said, you need to learn some programming, web and scripting languages + frameworks:
I would make sure to know/learn following in order:
Note: while learning web stuff, try to learn as much as you can about how the web works, technologies used, etc. Your networking knowledge should help here
To practice things security related:
Black Friday deals:
https://www.reddit.com/r/AskNetsec/comments/9yza56/2018_list_of_black_friday_netsec_resources/
https://pastebin.com/aLBfQT6H
&#x200B;
&#x200B;
Extra books: https://nostarch.com/hacking2.htm (The art of exploitation) (not a super beginner but it's on sale now)
Disclaimer: I am a software engineer, so the security field is new to me as well but for now I am doing hackthebox :).
The Shallows: What the Internet is Doing To Our Brains
I think NoFap is really just a niche part of a bigger drive to get away from the internet (or at least use it differently), and I completely agree with all of it. The internet (if used without taking precautions) and porn both change the physical structures of our brains in ways that preclude having a fulfilling life with longterm satisfaction. Fortunately our brains are very plastic and it's not too late to fix them.
I've tried quitting the internet cold turkey, and it's haaaaaard. The problem is that it's a global addiction that's deeply intertwined with our social and work lives. You can't really get away from it without totally alienating yourself, so quitting all of the internet is not viable. It's very difficult to draw the line between useful or necessary internet usage and bad internet usage, so moderating your own internet usage can be tough.
Here's my attempt at drawing that line, though:
Obviously education and entertainment are important, but the internet is just not the place to do it. With respect to education, the internet will promote distractedness and a habit of multitasking, and ultimately your learning will suffer (the book I mentioned focuses on this). If you want to learn, try to use the internet to find books, and then use those books to learn (or take a class, etc).
There are, of course, certain things you can learn only through the internet. Tutorials, for example, are online, as is the vast majority of modern journalism. You need to be careful with either of these. When it comes to reading the news, I like to use my tablet and the Pulse application, and I'm only subscribed to longer-form journalism like the type you'd see in The Atlantic. When it comes to tutorials, do whatever you can to not open additional browser tabs. In either case, you should at the very least read these things like you would read a book. Don't allow yourself to get distracted by hyperlinks, and if some topic confuses you, usually it's okay to just ignore it (or mark it) and press on, rather than try to immediately learn about this other topic through outside sources.
As for entertainment, that's something you can do in real life with real people (or again, with more reading, which is always healthy). Entertainment online is a process of overstimulation and isolation. Porn falls into this, but so do videogames and even mindlessly clicking pictures on reddit. In general, if you get on the internet without a clear purpose, you will probably be using it for entertainment, so always try to tell yourself why you're getting online before you do it.
The first good use for the internet is data acquisition, by which I mean it's a good place to go to find a fact or set of facts. For example, if you want to go see a movie it makes perfect sense to get on the internet and look up movie times. In these situations, you'll get online, find the information you want, and then quit.
Communication is a bit iffier, and maybe it should come with its own set of restrictions. Email and social networking are great, insofar as we don't use them for entertainment. I don't really suffer from this problem, but when I get on facebook it becomes pretty clear that many people are sort of addicted to self-posts and being heard. This might be absolutely fine for all I know (you could liken it to journaling), so for now I'm going to just assume that social networking, love or hate, is something we're going to have to live with if we want to partake in the 21st century.
This might warrant its own post, since I've got quite a bit to say on it (I've kept most of it inside my head, so it might be totally rubbish for anyone else as far as I know).
You may want to narrow that down a bit, but okay, here are some highlights, with amazon links to help disambiguate.
http://www.amazon.com/Game-Programming-Gems-Adam-Lake/dp/1584507020/
www.amazon.com/Game-Engine-Architecture-Jason-Gregory/dp/1568814135/
http://www.amazon.com/Game-Engine-Design-Second-Edition/dp/0122290631/
http://www.amazon.com/Game-Engine-Architecture-Engineering-Applications/dp/012229064X/
http://www.amazon.com/Artificial-Intelligence-Games-Second-Edition/dp/0123747317/
http://www.amazon.com/AI-Game-Programming-Wisdom-CD-ROM/dp/1584500778/
http://www.amazon.com/Real-Time-Rendering-Third-Edition-Akenine-Moller/
http://www.amazon.com/Real-Time-Cameras-Mark-Haigh-Hutchinson/dp/0123116341/
http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/
There are many others, but looking at my shelf these are the big ones that stick out for recommendations.
Firstly, don't be confused: PSM is not Vita. It's a separate platform that Vita supports but is also available on tablets and smart phones. Releasing a PSM game means releasing on not just the Vita but also on touch only devices.
Second, you may be best served by first understanding computer graphics at a lower level. 2D and 3D are pretty much the same thing when it comes down to it, the biggest difference is in the projection used by the camera and the pipeline for your assets (as you'll need your models in a format that is supported by the pipeline or write your own pipeline). There are plenty of books out there but I highly recommend Real-Time Rendering.
PSM has support for 3D just like most other frameworks. A quick Google search got me this. Or, you can do everything yourself as you have access to the GPU via a very nice VertexBuffer API in the PSM SDK. While I wouldn't recommend it to get a game out quickly, I would suggest giving it a shot to better understand how a vertex buffer works and renders a model. It's a portable skill: being able to build a vertex buffer and shaders to render your own models is something you can take to and graphics framework.
Last thing is MonoGame, which is an open source and cross platform implementation of Microsoft's XNA. The reason why you see a lot of "how to transfer your project over" is because that was what it was originally meant for: getting your XNA project to use the MonoGame library to bring it over to other platforms. So, realistically, what you want is to look up 3D in XNA. Keep in mind though that PSM support for MonoGame is still under construction. I'd recommend not using the binaries on their site but actually pulling the latest from git and building the project yourself to make sure you have the latest code.
As for gravity/physics, there's nothing built into PSM or MonoGame the way there is in Unity, which uses the PhysX engine. You'll need to find an external library or write your own physics solver. Or, if your game doesn't need realistic physics, try to get away with a simpler model that only uses AABBs or spheres.
I was in your same shoes 3 years ago when I took my first SA internship. I was the only person on site for 8 employees locally, 30 around the country.
I was scared to make actions at first but the first thing you need to do is learn your network in and out and document the shit out of everything before you even make a change. After that, you will be confident and I am sure of it.
1.) Begin a document called "IT Department Handbook" - add everything you find to it, except passwords. Refer to it, love it, it will always save you. Include disaster recovery in it. Make it so that a third grader can understand it. I have one thats 50 pages right now. This will save you as it has saved me so many times. Make it confidential though, because it will end up holding information you don't want people to see on the outside such as IP addresses and your network map.
2.) Keep passwords file but separate from the system and indistinguishable. I actually keep a password file on my phone in my memo's app but I don't have the full account usernames associated with each one. I provide really indistinguishable hints to the username, usually riddles that only I would know.
3.) Get Veeam endpoint backup and find a place to backup your DC (full backup) and any databases at the very least. You can create a standard for backups later.
3a.) Find the Domain Controller's recovery password immediately.
3b.) Create a recovery USB for all your servers and put them in a location where you can find them later.
4.) Get a Network Diagram going, then after that...
5.) List all Roles and Features each server has on the network diagram, what each server stores, what applications run on them and how essential they are to the business. Example: Domain Controller. No domain controller, no work can be done. CRM: No crm, people can't keep of their cases on the webserver but rather locally, they can live without it for a short time. Start thinking about disaster recovery.
6.) Develop a Khanban System. It's an agile project management method I learned from reading This Book -- I highly suggest buying this to help you better your practice. Put tasks in the backlog and move the ones you think need to be done sooner than others to your daily or weekly sprint.
7.) Find out who uses what server for certain tasks. This may take a while but it helps.
8.) Something I do personally before doing any changes to Group Policy or Regedit is I save their current configurations before making changes. Therefore, if something doesn't work right after a setting is changed, you can quickly revert back to it's last state.
9.) If you have the capability and hardware, get clustering going. So if a DC1 fails, DC2 takes over and everyone can still authenticate and work.
10.) If you have the capability and hardware, create a test environment reflecting your live network on a very small scale but enough to test "Ok so if I make this change, can people from workstations still login, can they still access the development server... etc." - you can create a test domain under your current forest and have it remain separate in this test environment.
11.) If it's not already in place (this might take some time) create a naming nomenclature standard. I.E. DC1.example.com (domain controller 1), DC2.example.com, PS1.example.com (production), WEBS1.example.com (webserver), TE1.example.com (test env.), WK1.example.com (workstation number 1...2...), VM1.example.com (virtual machines). This will help when it comes to debugging issues. My boss likes to make personal names for his servers which drives me fucking nuts because we have 20 servers between us and our clients that we manage. It's a lot better for him to mention "yea I cant get into PS1." rather "I cant get into rabbit" - and there I am trying to remember which server rabbit is and what features it holds off the top of my head; which is where a network diagram can come into play.
Books are still the best way to learn C++! C++ Primer, 5th Ed. covers all the basics of C++11 from functions and standard library usage to OOP and templates. Effective C++ reinforces good practices and idiomatic C++ that, despite being written for C++98, is just as relevent today as it was then, some of its contents even more so than ever before. Then Effective Modern C++ then does the same for C++11 and C++14 features, building on top of what C++ Primer covers about C++11 and introducing the subtle changes brought about by C++14. This is my primary recommendation for learning modern C++ from the ground up.
But we live in the internet age! Best make use of it! So many wonderful talks from conferences such as CppCon, C++Now, Meeting C++, ACCU and Code::Dive are all available for public viewing. With regards to modern C++, Herb Sutter's CppCon 2014 Back to the Basics! Essentials of Modern C++ Style and CppCon 2016 Leak-Freedom in C++... By Default are great videos to watch. For more specific topics, here is a list of videos that I've seen and personally found engaging, educational, and worth my time to watch (multiple times!):
rand()
Considered Harmful and What C++ Programmers Need to Know about Header&lt;random&gt;
for random number generation,auto
anddecltype(auto)
(I miss Scott :'( ).There are also shows such as CppChat and CppCast where interesting events, projects, papers, and people related to C++ are brought up and discussed. There are so many interesting blogs to read!
And there is always people on IRC (##c++, ##c++-basic, and ##c++-general) and the Cpplang Slack Channel for live updates, discussions, debates, questions, answers, and/or just plain fun with a group of people that ranges from complete noobs who are learning the basics, to committee members and library authors whose names are known across the community. If you ever have a question or need help, these are the places to go and ask (/r/cpp_questions is nice too! :P ).
And finally, links to videos, blog posts, articles, papers, interesting Stack Overflow questions, almost everything mentioned above is constantly being shared at isocpp.org and on /r/cpp. Subscribe to both to get a constant stream of links to anything and everything about C++.
Edit: as for C++17 material, the standard is not technically completed/published yet, but that hasn't stopped the community from creating material about it! This paper lists all the changes from C++14 to C++17, with links to relevant papers, and this Git repo provides a simple "then, and now" comparisons of the major changes to the language. Talks describing the changes in breadth and in depth have been given at conferences, and blog posts have been written for a more textual description of the changes. C++17 is not a major update like C++11 was to C++98, but full of fixes, conveniences, more language flexibility and utility, and new toys to play with! If you have a solid foundation in C++11, C++14 and in turn C++17 should be relatively easy to pick up compared to the shift from classic (C++98) to modern C++.
TL;DR Learn C++11 the best you can. Once you are comfortable with C++11, the transition to C++14 will feel natural, and C++17 will be waiting just around the corner.
Here is a "curriculum" of sorts I would suggest, as it's fairly close to how I learned:
Generally you'll probably want to look into IA-32 and the best starting point is the Intel Architecture manual itself, the .pdf can be found here (pdf link).
Because of the depth of that .pdf I would suggest using it mainly as a reference guide while studying "Computer Systems: A Programmers Perspective" and "Secrets of Reverse Engineering".
Of course if you just want to do "pentesting/vuln assessment" in which you rely more on toolsets (for example, Nmap>Nessus>Metasploit) structured around a methodology/framework than you may want to look into one of the PACKT books on Kali or backtrack, get familiar with the tools you will use such as Nmap and Wireshark, and learn basic Networking (a simple CompTIA Networking+ book will be a good enough start). I personally did not go this route nor would I recommend it as it generally shys away from the foundations and seems to me to be settling for becoming comfortable with tools that abstract you from the real "meat" of exploitation and all the things that make NetSec great, fun and challenging in the first place. But everyone is different and it's really more of a personal choice. (By the way, I'm not suggesting this is "lame" or anything, it was just not for me.)
*edited a name out
When I started, the most memorable three resources I know I had were the following:
After you're done with the two above required books, here are some useful readings:
The above readings will probably be a solid 6-12 months to read and absorb assuming you spend a couple hours a day, but I think it'll be well worth it in the long run since this type of stuff sticks with you for a long time. I read the above around 2013, and I can still talk about the CFS/other schedulers, software interrupts, and how the CPU cache works. It'll also make converting to other languages even more of a breeze because you'll know how everything works underneath the hood.
Check out Game Programming Patterns, it contains lots of examples of how to write code with a good structure.
Game Engine Architecture is also very useful, but much more theoretical and heavy, but it explains nicely most of aspects of game engines and gives you a lot of ideas of how to approach different problems.
Don't halt your progress by just reading these books and starting only afterwards: they'll take a long time to finish. Start with basic things, for example Game Loop chapter. Make a simple, but good loop and start building things. Just get something playable on the screen first.
By the time you do it, you'll have some problematic code which you'll need to fix. For example, you may not be satisfied with how closely tied some things are. At that point you'll read about event queues and will find solution to a lot of problems.
And that goes for everything. You don't just start with perfect architecture, but with some experience you'll get an idea about what works and what doesn't. Some people write the same spaghetti for a long time and don't improve, but if you learn some good concepts, it's very unlikely that you'll ever return to worse practices.
And it's also very important to not follow bad coding practices: globals are mostly bad, spaghetti code also should be avoided. Don't write big functions, don't write big classes. Don't just hope that the code will become better just randomly. Having huge functions and lots of global variables everywhere makes it much harder to improve and refactor your code.
Feel free to PM me with questions about how to make your code structure better. I'm very interested in the topic and will be happy to help.
P. S. If you haven't read Effective C++ and Effective Modern C++, you really should. It's a great way to improve your code considerably.
Both posts here (so far) give good advice in terms of learning assembly. I personally used the OpenSecurityTraining course that was linked by /u/miguelhgn to fill in gaps I had in assembly, and I second his advice to check that one out. If that course proves to be too steep, I'd take a step back and learn a bit of C -- so that you can better understand the context of the assembly you would be reading. For free resources, I generally like to recommend https://publications.gbdirect.co.uk//c_book/ or http://users.cs.cf.ac.uk/Dave.Marshall/C/ as they're iso-9899 recommend free resources that cover a pretty good scope when it comes to C itself.
If you'd prefer a more textbook style of reading, and don't mind shelling out money, I generally recommend C Programming: A Modern Approach above anything else that's out there, but it's far from necessary to get this if you find that you learn from the free resources just fine.
As for recognizing patterns in assembly over time as mentioned by /u/poindexter_one, that would best be implemented by using https://godbolt.org/ imo, and starting with smaller C snippets, trying different compilers and optimization levels, and gradually doing the same with more complex code. A good exercise when you start to get good at that, is to also try to do the same thing in the opposite direction (Seeing assembly, and trying to construct C code from it, AKA a part of reverse engineering)
As for your question "Should I learn Assembly language?" depends on where your interests lie, and what you eventually want to learn / be able to do down the line. It's absolutely a good thing to be able to understand though.
I started programming in Java few months ago to develop Android applications. These are the resources I used:
All of these books except for the first are near 400 pages each. However, most of them do not require you to read all of it. It would be great to read them entirely, but you can still make do by reading the sections you need the most. A lot of the books listed as classics are books I found that a lot of universities use as I was browsing some curricula. This list focuses upon general programming as I believe mobile development and web development are just learning how to use frameworks which I consider trivial to learn generally since a lot of people say that if they work a place that uses framework X, their workplace gives them some time to brush up or get up-to-speed with the framework and how to use it over a few days unless you require a niche or complex solution to a problem.
If you are not a huge fan of books, searching these titles will probably provide online tutorials or videos. The Amazon links can provide great reviews and suggestions. I like the books even if they are a bit long because of their professionalism, review, and rigor associated with the publication process of these textbooks that inhibits the rise of bad habits which might be introduced by online sources.
I do not know your background with these topics, so you may already know the, but these are the resources I think which really helps people transition from just knowing syntax as "knowing a language" which they translate to "I'm proficient in X because I can write a program which allows you to save text to a file" to knowing a language regarding software engineering concepts which helps you work properly on projects medium to large projects you would find in a workplace as an intern maybe entry-level employee (but more formal education might be required).
However, I'm pretty much like a high school student (took a year off before starting college to recover from an illness), so take my advice with a lot of salt, but these books which I couldn't apply 100% helped me make a small-medium sized Android application: https://github.com/jparkie/Aizoban which was designed enough to allow me to manage refractoring to introduce new features or fix issues which I believe would have been impossible if I hacked my way through to write around 35,000 lines of code.
My recommendation is that you learn the C programming language well before attempting to learn Objective-C. There are tons of online and text resources for learning, the one most used by university C programming courses is this text:
http://www.amazon.com/Programming-Modern-Approach-2nd-Edition/dp/0393979504/ref=dp_ob_title_bk
Ideally you should get a copy of this or another good learning text, but again, if money is an issue there are resources online for learning.
Here's a good site with lots of videos: http://www.lynda.com/default.aspx
Also this: https://www.udemy.com/c-programming-for-beginners/
And there are resources online that are totally free as well, although they aren't typically as comprehensive and may require a bit more initiative on your part, a quick google search will give you several examples.
With all that said, I'll go ahead and answer your questions, with the understanding that if you just try to dive right into Objective-C it might not work so great for you. This is going to be over your head, so don't get discouraged by it, just remember, we all started somewhere, good luck learning programming!
> 1.) What is a property?
A property is an attribute that the system automatically creates standard accessors (methods to get an attribute) and mutators (methods to change an attribute). Properties also allow you to specify atomicity (a specifier that guarantees thread safety at a small performance cost) as well as reference strength (strong adds 1 to reference count, weak does not). There is more to them than this, this is just a brief overview answer.
> 2.) Why do you need both a public and private API? How do you determine what goes in which?
Public simply means things that you want exposed outside of a class, whereas private are things that only the class should see. By doing this, you can convey to programmers who use your class how the class should be used, as well as restrict access only to attributes that the user of the class needs. This concept is called encapsulation, and is a key concept in object-oriented programming.
> 3.) What is an argument?
An argument is a variable or object that the calling function supplies to the called function. It is the primary means of passing information from one function to another function.
> 4.) What is a heap and a stack? What does it mean when objects "live in the heap"? (Do they live in condos? Is it a quaint suburban community?)
The heap is a block of memory that can be allocated as a program is running. In Objective-C, all objects reside on the heap, because of the way the Objective-C runtime works. In contrast, the stack is statically (compile-time) allocated memory. Primitive types such as int or char are statically allocated.
> 5.) So classes are the .h and .m files in Xcode?
The files with the .h extension contain the interface of a class, which is the file that other classes using this class import. The files with the .m extension contain the implementation of a class, which is where the details of how a class's methods are outlined. This separation exists to simplify linking of files when a program is compiled, as well as to facilitate precompiled libraries (where only the header is visible as source, the implementation is provided as a binary).
> 6.) What do all the differet colored text in Xcode mean?
In Xcode, go to Xcode > Preferences > Fonts & Colors
> 7.) Why are some things capitalized and others are not in Objective C code?
As you learn programming, you'll learn that good programmers adhere to conventions when writing code. The specific reasons why things are named the way they are will come to you as you learn, just bear in mind that good code that follows recommended guidelines is easier for other programmers to work with, your colleagues will thank you for doing it right!
I agree, I think software development skills are going to only further bleed into other stem disciplines in the future. Plus it can be a back up skill if traditional engineering ever gets tiring. That way you're not tied to only one employment source.
I'd also steer away from VBA or .NET and get better at python (for the data analytics in research) and learn C (for potential robotics applications). I normally wouldn't recommend C as a first language since it doesn't do as much for you as other languages, but this FREE edx Course does such a great job of teaching it interactively that I think it's worth it in your case: https://courses.edx.org/courses/course-v1:Dartmouth_IMTx+DART.IMT.C.01+1T2018/course/. I like this course because they have a in built C compiler and a visualizer that shows you what each command you type would do to the program.
CS definitely bleeds over into some disciplines. Especially since you have an interest in research and robotics. I think a combination of ME + a CS minor can get you a foot into some research and/or robotics internships.
As for books, I think a combination of Think like a Programmer and Head First C and Head Start Python would be great "beginner books"
Then if you find out you really like programming you can get into best practices and how to build bigger complex programs with a book like Code Complete.
But before all of that just get the basics with python, then move to C if you ever decide to move into robotics.
"IT skills" is pretty broad. What is your IT degree- MIS, Cyber Security, Information Sciences, etc? The answer will really depend on what your degree is in and what your interests are. For example, I could tell you to study programming, but if your degree and interests align more with Cyber Security policy implementation, that might not be the best recommendation for you.
As somebody who has been on a few hiring committees, I'd say to work on your soft skills. In many cases, these are more important than technical capabilities. Specific soft skills I look for in new hires: organization, attention to detail, solid time management, communication, and self-sufficiency yet a team player. For us, we will take the candidate who doesn't know everything but has a good attitude and willingness to learn over the person who thinks they know everything and has a horrible attitude.
General technical skills you should toy around with: know your way around Active Directory in Windows, learn how to view event logs on a system (for Windows, hit your Start key and type in Computer Management), NIST Risk Management Framework, learn the parts of a computer and how to set them up and tear them apart. Learning Linux is also good- what I did to understand Linux better was purchase a Raspberry Pi and set it up to run Raspbian OS and RetroPie (to turn the Pi into a retro gaming machine). I also purchased The Linux Command Line and practice the commands from the book in the Raspbian terminal.
Also, before graduation, try to get some kind of internship, even if your major doesn't require one for graduation. It's a great opportunity for you to build hands-on experience and work in an IT environment doing real work. Oftentimes, you will learn something new in your internship that is not taught in school, and the experience might broaden your interests a bit (not to mention you may get a job offer or at least great references because of your internship!). If you need assistance in trying to figure out how to land a good internship, just let me know.
You don't have to know anything about programming going in, as aixelsdi mentions. If you want to get ahead, here's some information which may help you do so. The rest is up to your own initiative. It can never hurt to know more about CS or more languages, as long as you don't waste time complaining about what's better in [insert language of choice].
I wouldn't recommend learning data structures and algorithm analysis before coming to UCI. Not because they aren't fundamental, they are. But because most people find it harder to learn those abstractions before learning the tools that utilize them (Python, C++, etc), which is why ICS 46 and CS 161 aren't the first classes taught. If you like math proofs more than math problems then maybe go that route, it could be helpful as iLoveCalculus314 mentions.
Languages: The CS introductory series (31-32-33) which you'll be taking first year is taught in Python. It switched to this because it's a good first language as a teaching tool. Right after you're done with Python, 45C will teach you C++ and 46 will use C++. The lower division systems core (51-53) generally use C or C++ but it differs by professor. Knowledge of Python will be useful in making your first year easier. Knowledge of the other two will make your next three years easier because they're common mediums for upper division courses. But you should be able to pick up a new language for a specific problem domain by the time you reach upper division.
Courses: If you want to get a head start on planning your courses, check the UCI Catalogue - Computer Science page. At the bottom it lists a sample of what your schedule over the 4 years might look like. That page is for the "Computer Science" major, for other majors in ICS see here.
Course Resources: You can actually view the Schedule of Classes without being a UCI student. Select a term (like Fall 2014) and a department (like I&C SCI) and it will list what classes were offered that term. Most lower div will be I&C SCI, most upper div will be COMPSCI. From the results you can go to the websites for those courses to see a syllabus, books used, etc. For example, here are the current websites for the introductory series ( ICS 31, ICS 32, ICS 33 ).
Your course professors and books and assignments will NOT be identical to those, but looking at what's currently taught will give you a pretty good idea of what the course entails so you can pre-learn anything that sounds difficult.
Books: If you have to pick one book to learn before coming to UCI, I would highly recommend C++ Primer, 5th Edition. It's very well structured as a self-teaching tool AND as a reference manual. You won't come away with any Python knowledge, but picking up Python as someone versed in C++ is easier than the other way around, and you'll find 45C much easier as well since you can focus on language quirks rather than fundamentals.
If you choose to learn Python first, Introduction to Computing Using Python: An Application Development Focus is the book currently suggested for ICS 31/32, and Learning Python (5th Edition) is suggested for ICS 33.
Another solid circlejerk book in the CS community is Code Complete, but I wouldn't recommend reading that until later on since it's more of a "best practices" book.
There are a ton of books, but i guess the main question is: what are you interested in? Concepts or examples? Because many strong conceptual books are using examples from java, c++ and other languages, very few of them use php as example. If you have the ability to comprehend other languages, then:
http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/ref=sr_1_1?ie=UTF8&amp;qid=1322476598&amp;sr=8-1 definetly a must read. Beware not to memorize it, it is more like a dictionary. It should be pretty easy to read, a little harder to comprehend and you need to work with the patterns presented in that book.
http://www.amazon.com/PHP-5-Objects-Patterns-Practice/dp/1590593804 - has already been mentioned, is related directly to the above mentioned one, so should be easier to grasp.
http://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420/ref=sr_1_1?ie=UTF8&amp;qid=1322476712&amp;sr=8-1 - one of the most amazing books i have read some time ago. Needs alot of time and good prior knowledge.
http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672/ref=sr_1_4?ie=UTF8&amp;qid=1322476712&amp;sr=8-4 - another interesting read, unfortunatelly i cannot give details because i haven't had the time to read it all.
CompTIA content is too much theory imho and having to renew them every 3 years now seems less appealing to me.
I'd say you head for the CCNA directly. While studying CCNA, you can use the Network+ study materials for any theoretical aspects you don't understand. N+ covers these better than most CCNA study materials.
Security+ is very nice but again, renewing every 3 years is not appealing. However, it does teach you a lot about security processes and a bit of law, compliance and standards.
There are other security certifications, some vendor dependent like the CCNA Security or the Juniper ones. If you're using these products, they are worth having otherwise, there are not many vendor-neutral ones as good as Security+. Careful with some of the vendor-specific ones, they tend to be more like adverts for products instead of certifications, basically "my product can do that!"
For Python, you are right. It's an excellent language for writing quick scripts for automating things. I personally liked Learning Python as reference, but if you're a beginner then Dive into Python3 might be appealing. Head First Python is also good but a new edition is due in 2015 I think.
You might have to choose between Python2 and Python3. Yes there are incompatibilities and not all libraries are available for Python3 yet but if you're starting from scratch, start with Python3 directly.
Nice curated list, but I'd recommend adding a few more interview prep sites from this list:
The 10 most popular coding challenge websites for 2017
Because I would definitely recommend someone to check out TopCoder, Coderbyte, and Codewars if they are preparing for an interview.
Here are a few resources I've also used when preparing for interviews (taken from previous comments of mine):
"I craved for games that had easy achievements so I could feel good again."
+1
The industry gamifies games to make you want to play them regardless of their quality. It's not even a "I want to finish a hard game" or "I want to complete a hard game". You just want the 100% completion/platinum trophy and we will be inclined to choose the easy way to the reward.
I've been reading about dopamine and its behavioral effects. Apparently it doesn't only moderate reward but also motivation. Check my comment posted today for explanatory links.
You essentially opted in for easy reward over hard, it's like opting to avoid going to the gym or improve your social skills in favor of playing video games and indulge to pornography. Another good book is the shallows: what the internet is doing to our brains where the author argues that the medium (how we choose to convey a message) can affect us more than the information.
Because another thing that gives us quick fixes is the novelty of browsing Reddit for funny things, and the warmth of social approval that we get from getting one of our comments/posts upvoted.
Thanks a lot! I actually have that first book bookmarked but I forgot to put it on the list.
I'm leaning closer and closer to purchasing a copy of The Art of Game Design: A Book of Lenses and it's one I'm actually really curious about.
On Game Physics Pearls - I peeked into the first few pages and it looks like something that I will pick up once I have a bit of experience in that area...does that sound about right or would you say it could cater to beginners fairly well?
Game Physics seems like it may be a bit more beginner-friendly but you are right about it not being a tutorial, which is kind of important for me at this step. I'm definitely bookmarking this until I know a bit more on the subject, though. I'll be taking a Physics course next September so it may be a good time to look at it after that!
Real-Time Shadows looks very interesting but I'm unsure to the difficulty level of it to a beginner. It sounds like I need to brush up on my math after three years of not using it very often at all.
Thanks a lot for the suggestions!
*I'll be taking a course on Linear Algebra here in the coming semesters, but that book does sound like a good introduction along with how it works within 3D programming. I'll keep a look-out on that for a while; do you think it would be very worthwhile to read that before something like Real-Time Rendering?
These are books I actually own and would recommend. Of course there are other great/better books out there, but I'm going to stick with what I've actually bought and read or "read".
I say "read" because several books are NOT meant to be read cover-to-cover. These typically have about 1/3 that you should read like normal, and then skim the rest and know what's in the rest so that you can quickly reference it. These books are no less important, and often even more important. I've marked these kind of books as #ref for "read for reference". Normal books that should be read cover-to-cover are marked #read
For learning your first language: This is really the hardest part and unfortunately I don't have any books here I can vouch for. I started with "C++ for Dummies" and am not including a link because it's bad. Your best bet is probably "Learning <language>" by Oreily. I also love the Oreily pocket books because you can carry them and skim while on the bus or the john, but you can just do the same with your smartphone. Pocket Python, Pocket Java, Pocket C++
Top Recommendations:
Accelerated C++ #read Made for people who already know another language and want to pickup C++. Also great for people who need a refresher on C++. I really like how it doesn't start with OOP but gets you familiar with the imperative parts of C++ before diving into OOP.
The Algorithm Design Manual #ref This is my new favorite book and the first I would send back in time to myself if I could. Each algorithm & data structure is given a mathematical breakdown, pseudocode, implementation in very readable C, a picture (very helpful), and an interesting war story of how it Saved The Day.
Cracking the Coding Interview #read I originally avoided this book like the plague because it represented everything I hate about coding interviews, but many interviewers pull questions straight from this book so this book can equal getting a job. Put that way, it's ROI is insane.
The Pragmatic Programmer #read Must-have for any profressional software engineer that covers best-practices for code and your growth. You can also find the raw tips list here
Head First Design Patterns #read Many prefer the "GoF/Gang of Four" Design Patterns which is more iconic, but Head First is a modern-version using Java to cover actual design patterns used day-to-day by programmers.
For Intermediates:
Effective Java or Effective C++ and Effective Modern C++ #read When you're ready to go deep into one language, these books will give you a huge boost to writing good Java and C++.
Design Patterns #ref You'll want to get this at some point, but early on it's too much for a beginner and many of the patterns are obsolete.
The Art of Computer Programming #ref The programming "bible" but like Design Patterns you should hold off on this iconic book until you've got your basics covered. It would make for a great purchase with your first paycheck or first promotion :)
So basically, what I do is I work for a large company that has almost no understanding of software.
Said company makes a lot of equipment that for various reasons is hard to provide hands on training for (sorry if I'm being a bit vague here, but I rant about work a lot on Reddit to blow off steam so I don't want to identify myself too much) so what I do is I recreate those things in VR (or sometimes AR depending on what better meets the needs).
By doing this, we have products that can be pulled up on demand, configured however we need, processes can be done in a way that mimics a hands on experience, and a lot of the logistical problems get removed. The end result is better quality training for workers, and a massively reduced cost as we eliminate time delays and travel overhead.
What we primarily work in is Unity. You do not need a game dev specific education to do game dev, but there are a few concepts that are used heavily in game dev that aren't used nearly as much in other areas.
Naturally, algorithms and data structures are still king. Efficiency is everything in game dev because you often can't just throw more servers at something to scale. You have to take your clients hardware into account as well. Poorer performance means your customers need better hardware, and that starts to limit your market. In my case, since I build everything for internal use, I get to basically specify the hardware they use, which makes this a lot more pleasant, it's analogous to making something for a console that's going to be exclusive to just one platform.
The most used data structures are often different as well. I would say that what I use is probably 90% lists, 5% dictionaries, 5% graphs, though the graph portion tends to make up the backbone of everything so it's extremely important.
Other than that, runtimes of algorithms are very important. For the stuff I do, we try to maintain 120fps for our headsets. So that means we need to handle all of the processing and rendering in each frame in 8.33ms.
Even mediocre code can typically execute in that time, and the real bottlenecks are on the CPU load side of things like lighting calculations and collisions, which more often than not fall on the artists unless you're doing graphics programming.
Math wise, there's typically a small amount of linear algebra if you have to deal with 4x4 matrices, but otherwise most of what you deal with tends to be things like vectors, normalization, dot product, and so on. If your university offers a class on 3d math it would be worth taking. If they don't, memorize this book and you're set https://www.amazon.com/Game-Engine-Architecture-Jason-Gregory/dp/1568814135
Unity and Unreal are the two biggest game engines, both of them use a component based system. So reading up a bit on good component based design patterns is a good idea as well. There are other game engines out there, and those may or may not use components. But, component design is going to be the future.
If you want to know anything else, just ask.
I'll start off with some titles that might not be so apparent:
Unexpected Fundamentals
These 2 books provide much needed information about making reusable patterns and objects. These are life saving things! They are not language dependent. You need to know how to do these patterns, and it shouldn't be too hard to figure out how to implement them in your chosen language.
&nbsp;
Good General book
&nbsp;
This book is great if you're going to make a browser based game
&nbsp;
General Knowledge books
&nbsp;
Provide a working moveable 3D model with C++ and DirectX, Very cool.
&nbsp;
More general game base building
&nbsp;
Working product results books, little if any modification needed
Releasing in a couple months (hopefully) 2 Very good books using C++ to develop by.
&nbsp;
Not presented in the best manner but still noteworthy:
&nbsp;
I used to love XNA...but now it's not feasible for commercial development. If you're a beginner to game design...starting out with XNA might actually be useful. It's easy to pickup and put out a working product. XNA is C#
&nbsp;
&nbsp;
Working product books, modification needed to make run on current systems
Provides a working FPS game in C++ on DirectX 9. Good for some starting out knowledge for an FPS
&nbsp;
Good for 3D Terrain rendering in DX9...however much of this is outdated...some concepts still apply, and it's not the worst idea to see a working example.
&nbsp;
TLDR: Click links starting at top, buy, read, profit
Are you looking for how to make games? Not just programming, but actually make them? I have some suggestions, but they often aren't about programming. There is a million books about programming, but finding those that talk about the ideas and ways to successively improve is a better point to start from.
Making video games is easy. Put the pitchfork down and let me explain. Anyone can open unity and load some assets and call it a game. Making good games is difficult, and even if you are not looking at card/board games, you should be prepared to test your game on paper. It is easier to make iterative improvement if you can look for mechanical and mathematical issues by scrawling some notes on paper cards.
For a book that covers both programming and game design, I also suggest this one.
These books will cover the psychology, the pitfalls, etc that come with making a game. You do not need a class to make a game portfolio. You can often get things done faster by a book, because it's goal is to teach as you read, not set a timer for 15 weeks. It can assume you will do it over 26 weeks or more if the book is huge.
Anyway, this is a much larger reply than I intended. Hopefully these are informative. If nothing else, they are significantly cheaper than a class.
I personally always use an IDE, because you will soon discover that there are dozens of libraries used by real world projects, and you cannot possibly know everything about them. However, IDEs have options to turn off autocomplete, incremental compilation and syntax highlighting, if you are a masochist... Google is your friend.
I read Algorithims in C++ by Sedgewick, and it was great, but not important for learning to code. You need to know the basic concepts of: the Java standard library, especially collections, looping constructs, etc. Any good tutorial should cover these. General CS knowledge is great and you will be quizzed about it in interviews. However, not necessary when starting out.
Eventually you will need to know about the Java memory model, concurrency and thread safety this was the Bible back in the day, maybe there more up-to-date options.
Math is an interesting topic; in college, you have to learn calculus, which is where many of us decide that we don't like math. This is a pity, since programming is applied math. Also, math gets more interesting, but often weird, when you start studying upper division topics.
Most data structures are based on set theory and relations, which are taught in Discrete Math. To understand what a function is, you need to know about Set Theory and/or Category Theory. Category Theory is fascinating, and particularly important for understanding functional programming. This is a great resource. To understand graphics, you need to know about Geometry and Linear Algebra.
It also helps to understand the basics of Probability, Combinatorics and Abstract Algebra. All of this math is advanced stuff however, most programmers don't need to know any of that...
Really, that's not even something I would consider all that important to know off-hand. I actually had to go to the REPL and the docs to verify how the
int
function behaved with alpha-numeric strings. This is the sort of thing that people might pick up with experience, but I wouldn't say it's such a commonly used feature of the language that not knowing it reflects poorly on your abilities.If you don't know something like this, you can just say that and use the question to demonstrate your reasoning skills and your general knowledge of the language. E.g. "I don't know how that would work off hand. But I know that python is a strongly typed language, so it doesn't do implicit casting. But where this would be an explicit casting, maybe it interprets the string as a number if a high enough radix is specified. Or maybe it behaves like
ord
and returns the ASCII value of the character. If I was in the python REPL, I would typehelp(int)
to see how it works, or I would go to python.org and look at the docs."Actually, having mentioned that last part, it strikes me that it sounds like they might have actually been talking about
ord
, notint
.Anyway, if, on the other hand, they're only looking for the technically correct answer to questions about obscure, unimportant, or easily googleable aspects of the language, then they're probably not very good at interviewing, or aren't all that knowledgeable themselves. I don't know if there's much you can do about that, unless you're willing to pursue an encyclopedic knowledge of the language. While it's good to be more familiar with a language, I don't think it's generally worth anyone's time to try to memorize every single aspect of it. Who cares if you don't know the exact signature for the
range
function, or the exact string formatting syntax to left-align text and specify a 79 character width, or whatever? That's what the docs are for.Having said all that, the int casting question sounds like it was kind of stupid, and if you're conveying it correctly, it sounds like maybe they don't even know what they're talking about there. The dictionary question, though, doesn't sound like a trick question at all. First-class functions, and the 'everything is an object' philosophy are pretty core features of python. If that's new to you, maybe bone-up with Dive Into Python, or Think Python, or Learning Python, or similar.
Good luck!
If you actually want to learn to implement efficient algorithms and data structure in C++ you might have a long road ahead of you since loads of them are quite complex. If you're interests are purely in machine learning than I would suggest you make use of the containers and algorithms provided by std and boost.
Going more domain specific and using things like armadillo or eigen. The later is used in many popular NN libraries/frameworiks such as tensorflow while the former is (based on my subjective opinion) quit easy to use, more similar to matlab and used in a number of libraries such as dlib and opencv. These "higher" level libraries are likely even better suited for your needs since they may help you use multiple cpus and gpus for your algorithms.
Further more, if you are interested in getting something shipped out quickly check out some C++ ML libraries, my personal favorite is Dlib but its quite limited in scope. However, I assume you wish to implement your own algorithm, in which case you are in luck because most of these libraries are open source:
https://github.com/tensorflow/tensorflow/tree/master/tensorflow
https://github.com/davisking/dlib
https://github.com/opencv/opencv
https://github.com/Somnibyte/MLKit
(are some examples of such libraries).
For familiarizing yourself with C++ I'd recommend:
-> so documentation
-> [Programming: Principles and Practice Using C++](https://www.amazon.com/dp/0321992784/?tag=stackoverfl08-20](https://www.amazon.com/dp/0321992784/?tag=stackoverfl08-20)
-> Effective Modern C++
Stack overflow documentation has plenty of examples that explain things which might otherwise seem strange about the language, Programming: Principles and Practice Using C++ was written by the creator of the language, Bjarne Stroustrup, who also happens to be a university teacher, so I would say it could be considered an objectively reasonable starting point for learning C++ for someone not very experienced with programming and Effective Modern C++, while aimed at programmers that are already experienced with C++, might give you a bit of insight into understanding why old codebases look the way they do and how to improve them and not repeat their mistakes (its also quite a well written book in many aspects, quite a pleasure to read).
Also I would avoid any C++ centric book on algorithms and data structures written pre 2011 like the plague, since the language has evolved a lot and you might find yourself learning a very old.
For programming, what kind of programming is he into? Here are some cool programming books and things:
Modern C++ (C++11 or later) books are not nearly as plentiful as those for Classic C++, but there are a few notables.
Bjarne's college text may be what you are looking for:
Programming: Principles and Practice Using C++ https://www.amazon.com/Programming-Principles-Practice-Using-2nd/dp/0321992784/ref=pd_sim_14_2/144-7765085-0122037
It is aimed at engineers, which makes it less general, but might be good for you.
Of course his general intro is also updated to C++11.
The C++ Programming Language https://www.amazon.com/C-Programming-Language-4th/dp/0321563840/ref=pd_sim_14_2/144-7765085-0122037
This is aimed at experienced systems programmers, so it may be a bit heavy for students, which makes the Primer (that you mentioned attractive).
C++ Primer https://www.amazon.com/Primer-5th-Stanley-B-Lippman/dp/0321714113/ref=pd_bxgy_14_img_2/144-7765085-0122037
Be certain to get the 5th edition.
Of Scott's books only the latest is Modern.
Effective Modern C++ https://www.amazon.com/Effective-Modern-Specific-Ways-Improve/dp/1491903996/ref=pd_sim_14_2/144-7765085-0122037?_encoding=UTF8
This is less an introduction for students than for Journeymen (Journeypeople?) programmers.
For just plain good programming style consider Ivan's book.
Functional Programming in C++ https://www.amazon.com/gp/product/1617293814
Don't be put off by "Functional." This style of programming will make your students excellent programmers.
There are some modern books of high quality that are niche.
The ultimate guide to templates:
C++ Templates https://www.amazon.com/C-Templates-Complete-Guide-2nd/dp/0321714121/ref=pd_sim_14_1/144-7765085-0122037
The ultimate guide to concurrency:
C++ Concurrency in Action https://www.amazon.com/C-Concurrency-Action-Anthony-Williams/dp/1617294691/ref=pd_sim_14_1/144-7765085-0122037
Some library options:
Despite its name, this is mostly reference. A very good reference.
The C++ Standard Library: A Tutorial and Reference (2nd Edition) https://www.amazon.com/Standard-Library-Tutorial-Reference-2nd/dp/0321623215/ref=pd_sim_14_2/144-7765085-0122037
Arthur's book covers C++17, which makes it one of the most modern on this list:
Mastering the C++17 STL: Make full use of the standard library components in C++17 https://www.amazon.com/Mastering-17-STL-standard-components-ebook/dp/B076CQ1RFF/ref=sr_1_fkmrnull_1
To what extent are you teaching C++ and to what extent are you teaching programing?
Good luck and have fun!
Well if you want to be the next Carmack, get cracking! :) You have a lot of ground to cover, such as: mathematics (matrices, linear algebra, etc), physics, artificial intelligence, real-time processing, multithreading, architecture, networking and protocols, rendering, sound, and much more!
It is certainly possible with enough time and dedication to develop your own engine. It's just that there are so many excellent engines already out there, that you would be competing with projects that have already invested many thousands of hours and have loads of titles already developed for them. Why not get involved with an existing project to start?
BTW I really like your idea of creating a FPS with one room and focusing on making that environment the richest possible, exploiting a wide variety of techniques. Do it!!
Is your ultimate goal to create an engine? Or to create a game? Remember, the engine is in many ways a means to an end - it's not much use without a game that uses it!
Either way, I think you would be well advised to get involved with one of the open source game engine projects, and start contributing. Once you've learned how they work, you will be in a much better position to design your own. And realistically, you can't really just design an engine without a game - you need to know how games work in the first place, and what features and architectural decisions and designs make for a good engine.
Consider joining:
Here's a list of good books to get you started:
The Reddit /r/gamedev wiki has a great list of resources:
There are lots of great videos on YouTube featuring Carmack's gamedev talks, so I highly recommend watching those too.
>Is there something wrong with me? Or is this a normal thing?
No, programming challenges are more about general problem solving via coding than the ability to write functioning apps. You have experience in the latter and not the former so will not be as good at coding challenges.
But like everything else practice is what makes you good at something so if you keep trying them you will be able to learn to solve them. And I think it is worth doing so, they teach you to techniques to solve some harder problems you can face in real world applications, though you might not see them as often. Overall they can make you a better programmer.
But there is a limit to their usefulness, like if you master app dev you don't master coding challenges, if you master coding challenges you won't master app development.
Solving the problems of coding challenges is a skill. It can be learnt like any other skill. I think it is worth learning how to solve them, but there is no need to become the best at solving them. If you are having trouble with all of them I highly recommend reading Think like a programmer which teaches how to better tackle problems you face and break them down into easier to solve chunks.
---
Some interviewers will ask you to solve a coding challenge. Through not always and the ones that do often use the same challenges (fizzbuzz is a classic one). Not being able to solve them will hamper some of your attempts to get a job, but won't stop you from getting any job. It won't even stop you from getting a good job as better places often ask better problems that are more relevant to the job rather than some random challenge they found on the web.
This is very much like saying, "I've learned how to write letters, and copied lots of sentences, paragraphs, and poems, and understand what they mean. How do I start writing my own text?" Programming as a creative art is a different thing from understanding the lexical structure of a language, or how to understand data organization, etc. It's as different as reading is from writing.
What you need is not directly connected to C# -- you need to develop a mindset and problem solving skills that let you turn a problem into a solution (which happens to involve programming). Relatively few courses or tutorials teach this, and I'd even say that many people who work in industry don't really have it either, unfortunately.
There are some resources out there along these lines. One interesting one is Think Like a Programmer, a book about analyzing problems and ways to come up with ideas to solve them.
Another great way is to learn from people who know how to do it. It's difficult if you don't know anyone. But one of the best things I've run across are conference presentations from people who've written amazing programs. A neat example (though maybe lower-level and geekier than you're looking for right now) is a talk by Eric Chahi, where he describes the genesis, design, and labor that went into creating the famous video game Another World.
One of the best things I learned in college was in an AI class. My professor taught a certain thought process that became an outline for many of my projects. Start with your data, determine how to represent it effectively, write code that does things with your data as you learn to manipulate it, and start putting the pieces together to do bigger and bigger things until it starts to look like a solution to your problem.
Good luck!
So as some of the others: I'm not from the gaming industry either (though I plan to make games on the side). And an other disclaimer: I'm over 30.
Let me just say most people in their 20s don't know what they would like to do, and even if they do, your interest will change over time, so just try to say flexible and don't fear making a switch if you are unhappy, of course within reason and financial security.
I recently switched from my regular office job to a less regular one in software development. My official background in software dev before was: none. I picked up coding like a year ago or so, because a C# course for game development was super cheap on Udemy (and by super cheap I mean like 10 or 15 USD), and continued learning coding ever since. Though I was a privileged candidate for my current job, because it was an internal hire, I basically got it by showing them what I can do. And we don't even code in C# in my new role lol
So my point is: learning doesn't have to be expensive, while some jobs require a specialized college degree a lot companies nowadays are more interested in whether or not you can do the job.
Also there are some Game Music courses on Udemy as well, though they might be too basic for you, still worth to check out imho :)
If you are interested in game design I would recommend this book too The Art of Game Design: A Book of Lenses https://www.amazon.de/dp/1466598646/ref=cm_sw_r_cp_apa_i_nay4AbC7P2BFB
ALL technology? As in you're not even allowed to listen to music? Because that's what I'd recommend if you can get away with it; a lot of people listen to music while they do other things but very few people sit down and relax and focus on listening to their favorite music without multitasking, it's a great way to pass time.
Failing that, taking up drawing or writing are economical options considering you're tight on cash. A loaner guitar or cheapo from a pawn shop could be healthy hobbies, but they're tough to learn without your computer to access resources.
You said you don't like reading but I'd suggest you try to learn to love it, because it's going to be one of the cheapest and most fulfilling ways to pass time given your constraints. I think as you spend time away from technology you'll find reading more enjoyable as your mind recovers some of it's ability to focus. Just going out on a limb here (and projecting a bit), but do you often feel unable to focus on tasks like reading long passages or say sitting back to watch a movie without interruption? I know at least one author who's written a book suggesting that the way we're presented with rapid-fire and incredibly diverse information/entertainment on the internet has left our ability for deep focus impaired, while our ability to multi-task has improved.
Another option that occurred to me mid-post is that you might try to find some cheap model airplane kits or something like that, they're quite time consuming if you can be meticulous.
There are lots of books that purport to do something like this, but the field is so varied in terms of tools and styles, it's kind of a fool's errand. One merely ends up writing a, Here's How I Did-It/Would-Have-Done It.
One book I like that is very comprehensive when it comes to game design is The Art of Game Design. It does try to address the practical matters of making a game, but that's not its primary focus.
One book I would recommend for finishing is The Game Jam Survival Guide and just doing a game jam like ludum dare. A game jam is a great way to get experience finishing a game, and time is so tightly constrained that it forces a very different, scope-limited mindset. The ideal is never, ever attainable and yet some really creative, amazing games do come out of these jams.
The CCNA can be taken a few different ways. As 2 exams (ICND1 and ICND2) or 1 exam (CCNAX). The combined exam is mostly for re-certification and for people that have been in a Cisco networking role for a while. Beginners should take the 2 test route. It is only $5 more expensive and will be much easier than the 1 test path.
Taking an instructor-lead class is going to be a crap-shoot. How good it is and how well it prepares you for the exam are ENTIRELY dependant on the instructor. Plus in-person classes are usually expensive. Self-study, in my opinion, is the way to go for almost every certification.
You should always use multiple resources to prepare for any exam. I recommend the following for the CCNA:
Pick up the Wendel Odom OCG (Official Certifiaction Guide). You can get it on Amazon for around $40 for both the INCD1 and INCD2 books. You can also get the /u/lammle book for around $30 on Amazon. The Odom book is considered very dry and hard to read, but has more information and goes deeper into the subjects than the Lammle book does. I personally do not have a problem with the Odom book and have readt it all the way through.
You should also get a video course. There are tons out there (CBT Nuggets, ITPro.TV, INE, Kevin Wallace, etc.). I recommend Chris Bryant's course on Udemy. It usually costs around $12 and is extremely good for the price.
You also need a lab of some kind. The most recommended would be a Hardware lab (with real Cisco routers and switches), GNS3, or Packet Tracer. Obviously a hardware lab is going to be expensive (probably around $300 for a basic one). I use Packet Tracer and while it has it's flaws and limitations it seems to be good enough for the CCNA. On top of that it is FREE. GNS3 is also free but requires that you have your own IOS images to run in it (which are not free unless you go a less-than-legal route to aquire them). There is also INE's lab and Cisco's VIRL but they are very expensive and VIRL requires a pretty beefey machine to run.
Read a book, watch a video course, and lab EVERY concet you can. If you really get stuck and can't figure something out or don't understand something after researching it yourself, come post here and ask. We are always willing to help.
> I learned in android studio and got to a level where I could create an app. Little did I know, it was just a giant main activity with 100s f methods. My friend looked at the code and told me I needed to learn polymorphism. Now I've redone the code so it's all inclasses.
Yep. This is a really common stage in learning. It sounds like you maybe went overboard and created way more classes than you needed.
Next time I might suggest starting with your working program with just one big activity, then splitting things into separate classes one at a time.
> Well, I have to keep updating a bunch of list sizes to the main activity, but the problem is that the polymorphism has the list sizes passing through 4 classes to get to the main activity. So, I set up a bunch of interfaces that react when things are done within the classes all encapsuled in one overreaching class. I don't know.
I think you're blaming "polymorphism", but polymorphism is just a tool. You can use it to make good designs or bad designs. It's quite easy to use it to design something that's cumbersome and less effective than if you had no classes at all, and it sounds like that may have happened here. It doesn't mean there's something wrong with polymorphism.
I think you're conflating two separate things here: (1) what's a good design, and (2) how do you make your code work.
(2) is easy. If you post a small, complete program that doesn't work, we can help you understand why. We can't do that if you just post vague questions and snippets of code.
(1) is hard. This takes years to get the hang of, and a lifetime to master. At a good software company you'd learn this slowly by mentorship - you'd have a senior programmer reviewing every change you make and guiding you through the design one feature at a time. You'd get help organizing your code long before it got to hundreds of functions.
If you don't have that option, or even if you do, I'd recommend the book Design Patterns as a way to better understand how to use polymorphism effectively.
You're also welcome to post such questions here, but they have to be very specific. You have to tell us what your app does, in a lot of detail, and how you've organized it into methods. I can't give you advice on something vague like "passing list sizes to the main activity" because I don't understand the purpose of the lists, the purpose of the sizes, or the purpose of passing them to the main activity.
You can always read books. Textbooks are much better to read when you're free to browse and pick out whichever ones you like. You can get a surprising amount of reading done just by reading on the bus, on the can, and whenever you've got nothing better to do.
A popular stack overflow answer has a pretty good list. You can preview the introduction of most books on amazon.
People like to champion the internet as "oh, you can learn anything on the internet!" Which is true. But you can learn it much faster and better from a book (generally speaking).
Books provide a long format which has a chance to build upon itself. Also, everything is collected in one place for easy access. More developers ought to sit down and read good books.
Agreed. There are plenty of resources out there that will help you understand design patterns. If you're new to the concept, I would recommend Head First: Design Patterns, it might be based on Java, but the examples are simple to understand and can mostly apply to PHP as well. When you feel like you've grasped the basic concepts of design patterns, you can move on to more advanced texts, like Martin Fowler's Patterns of Enterprise Design - this is a great reference for a lot of the more common patterns. There is also Refactoring: Improving the Design of Existing Code. These are great investments that will help you with any project you work on, and will help you if you decide to use a framework like Zend which uses design patterns very heavily.
Oh you're very welcome!
For resumes, the cleaner the better. You want it to stand out, but, please, do not make it flashy. When I was a technical support supervisor, I was able to assist with the hiring and interview of techs. First we'd run through the resumes and throw out the ones that were covered in glitter, fancy paper, bright paper, and this one was covered in Windows logos... the paper was watermarked with a Windows logo and even the bullet points were Windows logos (we were a Windows-based web hosting company). These kind of resumes leave a bad taste in your prospective employer's mouth. Here's a great template that is similar to how I have my professional resume setup. Minus the sidebar and the header (this stuff I just placed at the top of the page formatted like all the other sections with the exception of my name and contact info), this pretty much lines up how you should have a professional resume. This one is probably a better example. I'd also suggest getting a LinkedIn profile if you don't already and mirror your professional resume on there. Head hunters do frequent LinkedIn and you could get a future job offer from there as well.
I would focus on getting your A+ and Network+ upfront because they substitute some experience. Just take note that CompTIA has changed the tests so that re-certification every 3 years (I think) is required to keep your cert(s) in good standing. This book is shipping in August, and should be considered the Holy A+ Bible. It is pricy ($60), but worth it. Before I get too further along, it's worth mentioning that the A+ is 2 parts. Part 1: Hardware, Part 2: Software (Windows). I heard rumors that CompTIA was supposed to finally axe Windows 9X from the exam (yes, I know... you have/had to know Windows 95 for the exam...) but no idea if they actually did or not. This guide seems like a great starting ground.
I used the "Exam Cram" series which include several practice tests along with lesson reviews and chapter tests. But there are a wide variety. I'd really suggest going to your local Barnes & Nobel and browsing the selection of A+ and Network+ books they have and find one you feel will help you learn the most out of.
Let me know if you have any questions!
the easiest way is to strictly identify which part is really the variable:
foo=test
cp $foofile testdir/. # cp: missing destination file operand after 'testdir/.' ($foofile doesn't exist and expanded to null, not enough required params for cp)
cp "$foofile" testdir/. # cp: cannot stat '': No such file or directory ($foofile still doesn't exist, but expanded to '' due to double quotes usage - good practice)
cp ${foo}file testdir/. # will compy 'testfile' if exists
Also it is usefull to access command line params from inside the script if there are more than 9 params, to access 10th param use ${10}
and here is some list i noticed for myself of how to use this braces, while reading this book - would recommend:
Sorry for formating issues, reddit treats spaces and new lines in special way..
variable substitution:
substitution:
Bash supports various variables substitutions:
$a - will be substituted with 'a' value
${a} - same as $a but could be concatenated w/ string w/o spaces:
${a}.txt - will be expanded in a_value.txt
${11} - 11th positional parameter given to script from shell
${var:-word} - if 'variable' is set, the result will be its value
if 'variable' is unset - the result will be 'word'
$(var:=word} - if variable is set results in its value substituted
if variable is unset, it will be assigned to 'word'
such assignment will not work for positinal params(see 'shift')
and other special variables
${var:?word} - if variable is unset error with reason 'word' will be
generated, exit code of such construct will be 1
${var:+word} - if 'variable' is set, the result will be 'word',
(but variable's value will not be changed)
otherwise result will be EMPTY string
Example:
$ echo ${variable:-ls} - variable unset - ls used
> ls
$ export variable=1
$ echo ${variable:-ls} - variable is set- its value used
> 1
$ echo ${variable:+ls} - variable is set - ls used
> ls
$ echo ${variable1:+ls} - variable unset - empty line used
>
${!prefix} or ${!prefix@} - returns NAMES of existing variables
that starts from 'prefix.
Example:
$ echo ${!BASH}
> BASH BASHOPTS BASHPID BASH_ALIASES BASH_ARGC BASH_ARGV BASH_CMDS
string variables substitution:
${#var} - returns length of string in variable's value
Example:
$ var=123456789 #this could be interpreted as a string too now
> 9 #string length is 9
${#} or $# or ${#@} or ${#} - returns number of positional parameters
of the script being executed
${var:number} - return string from number to the end, spaces trimmed
variable is unchanged.
Example:
$ var="This string is to long."
$ echo ${var:5} #returns string from 5th symbol
> string is to long.
Example: spaces are trimmed:
$ echo ${var:5} | wc -c #count chars
$ 19
$ echo ${var:4} | wc -c #return starts from space
$ 19 #space is trimmed so same number of chars
${var: -number} - return string from end to number, spaces trimmed
NOTE - space between ':' and '-' signs
Example:
$ echo ${var: -5}
> long.
${var:number:length} - return string from number till end of lenth
Example:
$ echo ${var:5:6}
> string
${var: -number: -length} - return string number between number(from the
end) and length (also from the end)
NOTE: number must be > than length
Example:
$ echo ${var: -18: -2} #var is This string is to long.
> string is to lon
${@} - return all values of positional params
leaving spaces inside strings (like "$@" ) - bcs it know how
many arguments script has
${} is the same form, it seems
${@:num} - displays values of positional params but from num
$(@:1) - works same as ${@}
${@: -2} works , but starts from the end
${@:num:length} - same as with strings but with positional params
${@: -num: -length} - same as with strings but with positional params
${param#pattern} - finds shortest match and deletes it (lazy match)
Example:
foo="file.txt.gz"
${foo#.}
>txt.gz
${param##pattern} - finds longest match and deletes it (greedy match)
Example
${foo##.}
>.gz
${param%pattern} - same as # but deletes from the end of the file
Example:
foo=file.txt.gz
${foo%.} - note . instead of . in # example
>file.txt
${param%%pattern} - same as ##
${foo%%.}
>file
Search and replace:
${param/pattern/string} - replaces first occurance of pattern with string
${param//pattern/string} - replaces all occurances of pattern with string
${param/#pattern/string} - replaces only if at the beginning of the line
${param/%pattern/string} - replacesonly if at the end of the line
Hi PizzaPartify,
I believe that different companies/teams will place emphasis on different skills. When I was helping to hire software engineers for EA's motion capture studio, I liked to see candidates who showed a strong aptitude for engineering code to be maintainable. For me, this meant a familiarity with design patterns and software development processes (like Test Driven Development or Extreme Programming). In my department, much of our code was in C++ and Python. However, other departments would use languages like Java, C# or ActionScript - depending on the project.
It would be helpful to know what role you are applying to.
To answer your specific questions:
Regardless of the language you're working in, I would also recommend Design Patterns by the gang of four (http://www.amazon.ca/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612).
A game-specific recommendation is Game Engine Architecture by Jason Gregory (http://www.amazon.ca/Game-Engine-Architecture-Jason-Gregory/dp/1568814135). It doesn't matter if you intend to write an engine or not, it is immensely helpful to understand how they work.
I own all of the Game Programming Gems books but use them more as a reference library. The books above will be more helpful right now.
I hope that helps.
/r/learnprogramming has a lot of great articles pinned. Python is a easy language to learn to start off. But if you want to hit the ground running, either learn web development languages or C++. From what I know though, when people refer to IT, they are referring those working in Networking or Help desk. With Networking, you learn a lot about computer/router hardware in the beginning, and then move onto learning protocols and best practices. Granted that second part is massively understating what there is out there to learn. But the sky is the limit when it comes that field. Help desk is the entry level for IT personnel. You help people over the phone or in-person with their computer related problems. Lots of networking guys don't like this because you loose whatever faith in humanity you have left, some like myself, really enjoy it. I like helping people either in a jam, or just generally better understand how to do their job with the aid of technology.
Sorry for the length.
TL;DR
Grab a A+ certification and then try for a Help Desk position. Here is a good book to get your education started, [Comptia A+ from Amazon].(http://www.amazon.com/CompTIA-Certification-Edition-220-801-220-802/dp/007179512X/ref=sr_1_1?ie=UTF8&amp;qid=1382805315&amp;sr=8-1&amp;keywords=comptia+a%2B+certification+all-in-one+exam+guide+eighth+edition+exams+220-801+%26+220-802)
People talk about prototyping games a lot. Like, you have an idea so you build out a simple example so you can play it and see if it's fun on a basic level.
But what they don't really talk about, is prototyping code. It's hard to figure out how things fit together in a meaningful way if you don't already know the coding conventions or patterns that can help you build them.
As a self taught programmer whose work includes a good deal of coding now, I've gotten a lot of use out of building out small 'hello world' type examples of more complicated code structures.
Imagine you're trying to build a skyscraper, you wouldn't just try and build it straight out of your head, you'd follow a kind of miniaturized version of it, a blueprint. So that's what you should do as a programmer, make blueprints. Don't just make blueprints for your whole game, make blueprints for even the smallest sections of it if you don't feel like you completely understand it.
My wife is a senior-level project manager for a really large construction firm and her projects typically cost somewhere in the range of $500 million. When she's on the job-site supervising a part of the build, she doesn't refer to the blueprint for the whole project, she uses the blueprint for that specific part of the job. So if you're having trouble figuring out how to properly break a python game out into modules, don't look at coding examples of full games because you'll just find it overwhelming. Look for simple examples of python imports and module structure. But more importantly, build small examples of how that works using those examples to make sure it works how you're expecting.
Think of the game you want to make, and form some basic ideas about how it should fit together. Read up on programming patterns, game engine architecture, or artificial intelligence for games and whatever other topics interest you about game design. Make small code projects prototyping concepts that are interesting. I have a project folder on my computer that is filled with small examples of programming patterns, complicated data structures, skeletal game structures, and anything else that can serve as a blueprint for building something else.
So if you're reading and come across Entity Component Systems (ECS), and you think that theoretically sounds like a good way to build your game, don't start by trying to build a game using ECS. Build a prototype of an ECS pattern. Something really simple and instructive of how you would do it for a larger project, a blueprint.
For example, this is the actual code I wrote when I was prototyping one of my favorite patterns, the Service Locator.
class Service:
_audio = None
_graphics = None
@staticmethod
def playermoved():
if Service._audio:
Service._audio.play_footsteps()
if Service._graphics:
Service._graphics.animate_player()
class Audio:
def play_footsteps(self):
print("Pitter Patter")
class Graphics:
def animate_player(self):
print("Look at the player move")
audio_system = Audio()
graphics_system = Graphics()
Service._audio = audio_system
Service._graphics = graphics_system
Service.playermoved()
And if you read the description, you'll see that this example doesn't really fully articulate the pattern as described. But that's okay, because the point of the code blueprint is to experiment with implementing concepts in a way that works for you.
It depends a bit on what areas you're interested in. For interactive graphics you'll likely do OpenGL or DirectX or such.
Non real-time graphics usually means ray tracing or some variant like photon mapping where you want to produce physically correct images, with flexibility depending on your art direction e.g. Big Hero 6. With ray tracing you're essentially simulating how light interacts in the scene.
Here's some useful books/links for real time graphics:
Here's some for ray tracing:
For general math topics I also recently picked up Mathematics for 3D Game Programming and Computer Graphics which looks very good, though I haven't gone through it as thoroughly.
As mentioned already /r/GraphicsProgramming is a good subreddit, there's also /r/opengl for OpenGL questions.
First of all I should say that I'm no expert in these things, but I'm sure other people will be able to make other suggestions.
>I plan on installing Linux as my OS (technically my first time)
If you're more used to Windows then the UI will be fairly easy to get used to, but the biggest change will be the command line. This is a really powerful but complex tool and I think the best way to get used to it is really just to dive in and use it as often as possible. MagPi have a book for it (Conquer the Command Line) to get you started, but if you wanted something more comprehensive I've spent some time reading The Linux Command Line and found it really helpful.
For Python I think I started out with Code Academy, but mostly picked it up as I went along. I'm currently reading Python Crash Course and I think it is pretty decent, although most people seem to recommend Learn Python the Hard Way (note the tiny link near the bottom of the page to read the book for free).
At the end of the day the most important thing is to take baby steps and take them often: when you've kept at it regularly for a few weeks it becomes a lot more easy.
For HTML/CSS/JavaScript/jQuery, Jon Duckett's books are pretty good. I linked the set because individually they're about $23, and together it's $28. His is the only JavaScript book in my library. I found his books to be well-ordered, and he describes things in really simple ways, though the book layout feels like reading House of Leaves until you get used to it. Both books have made for great references, though free HTML/CSS tutorials are quite abundant, and I leaned on Google more than the book for learning those.
I can't recommend the Django book that I started with, "Mastering Django: Core" by Nigel George, as much of the advanced topics were no better explained than the official documentation. If you're using Django 2.0, forget it. This, and other Django books I've looked at, don't go into any front-end details, seemingly from a belief that "writing Python code and designing HTML are two different disciplines" (quoted straight from the book I linked). The official docs and web tutorials have served me better for bringing Django to the browser.
Aside from d3.js, I'm only using basic JS and jQuery. d3.js was a very specific use-case for the data I'm working with, as it excels at making graphs and charts using SVG. If that sounds like something you're doing, Interactive Data Visualization for the Web was pretty clear for d3.js. Note that d3.js only uses a minimal amount of traditional JavaScript, so do consider your project needs before dropping $40 on it.
The basics of JS and jQuery will go a long way, even without react/angular/vue.js. Just like my first statement about HTML/CSS, I'd say learn the other frameworks when you can no longer do what you want with JS/jQuery, or when a framework is going to save you time.
Sorry for the wall of text - hope that helps!
For A+, try Professor Messer's site. His videos are an amazing resource. I do a chapter in book study then watch the corresponding video on Messer's site. Works pretty well.
Also try Coursera, they have a lot of classes you can take for FREE from major universities. I am currently waiting on a networking class that starts June 24th. It's a high level class that offers a good amount of knowledge. No degree, but the knowledge is what you will need during interviews. And like u/esmith3498 said, F.R.E.E.!
Professor Messer - This is for 800 exams for a+, he also has training for net + and linux and the like.
Coursera - Use it!
A+ book - I love this book, very thorough.
GOOD LUCK!!! I am in the same boat as you. I am currently trying to get into the field too.
Yes, working at a big N now after several years of working for startups. You'll need to study up on how to do successful coding interviews (which at large companies are very different than the startup interviews you've probably experienced). Cracking the Coding Interview is a good start. Leetcode is also good practice but make sure you do some whiteboard practice as well since you won't have the advantage of a compiler when doing the actual interviews. If, like me, you didn't have a formal CS background, consider watching the MIT 6.006 Introduction to Algorithms videos and possibly doing the exercises before any of that. They were really helpful when textbooks like the oft-recommended The Algorithm Design Manual came across as super-heavy (but still useful as a reference).
Good luck!
^(Disclaimer: Opinions are my own, not necessarily my employer's.)
Thanks for the feedback.
On my first pass to the CCNA Exam, I used the following approach:
http://www.amazon.com/CCNA-Routing-Switching-Study-Guide/dp/1118749618/ref=cm_cr_arp_d_product_top?ie=UTF8
Note: If you buy the book then you get free access to the first 7 video training modules. You can buy a subscription on the web site to get access to the other 7 modules. Or you get it for free when you register to the live or online class.
The three big lessons learned from the class were:
I failed the first time that I took the test. I ran out of time with 5 questions not answered. I invested a lot of time on the sim's and test-lets. I was lost in the test platform with many windows opened learning to navigate to the proper pannel to answer the questions.
On my second pass to the CCNA Exam, I used the following approach:
I took the test and got a perfect score. I also had 25 minutes left on the clock.
Summary:
One needs to use the right tools, resources and approach to study very hard. The number one key is to focus on the test objectives and practice doing many sample tests.
This approach helped me pass the CCNA 200-120 test. Anything else is just busy work and nice to know for the real world application and not to pass the test.
Please note that each person learns in a different way or may have special networking skills and may not need to use the same approach.
I hope this information is of value to help you get the CCNA certification.
May you all have an awesome future in the Data Networking industry.
JM
Sure!
&#x200B;
I think two classic books to start with is
&#x200B;
Then I would move onto IDEO's Creative Confidence (https://www.amazon.com/Creative-Confidence-Unleashing-Potential-Within-ebook/dp/B00CGI3DWQ), which documents tons of different UX methods. Also, I haven't read it, but I've heard that Lean UX is a great book (https://www.amazon.com/Lean-UX-Designing-Great-Products-ebook/dp/B01LYGQ6CH).
&#x200B;
Oh and to learn HTML, CSS, and JS (if you don't know them already), these are AMAZING reads: https://www.amazon.com/Web-Design-HTML-JavaScript-jQuery/dp/1118907442/ref=sr_1_3?crid=1QXNLBZ2V6GL8&keywords=learn+html+css+javascript&qid=1558328362&s=gateway&sprefix=learn+html+css+ja%2Caps%2C-1&sr=8-3
&#x200B;
With that said, I know books are a big commitment so here's a random assortment of UX articles I've bookmarked over the years to get you started (some may be a little old but should still hold up from a process standpoint):
&#x200B;
There's a lot more where that came from, so let me know if you get through that and are craving more material.
&#x200B;
Here are a couple videos as well:
&#x200B;
Finally, here's a very very short article I wrote myself that provides a quick intro into human centered design: http://www.jdktech.com/human-centered-design/
&#x200B;
As you dive into this, note that user interface design and user experience design are different things--although they overlap and rely on each other in various ways. You can be a user interface designer (in which case I would recommend different reads), a user experience designer, or both. I'm a full stack designer, which means I specialize in all sides of the product life cycle, including research, validation, design, product management and development.
&#x200B;
Hope this helps! Let me know if you have any other questions!
This book has been suggested a few times so I finally got around to reading it. I think it has some good information in it. I'm only about halfway through it, but I like it so far.
Time Management for System Administrators
Other books would be any of the social books like "How to influence people", "7 healthy habits..." Etc.
I haven't read this one yet, but It has been suggested to me if you plan to go more into management/leadership Start with Why
Other books that have I have ear marked due to being mentioned:
Also, do a search for "Books for IT Professionals" to find a lot of other suggestions.
A lot of the balancing comes from play testing with actual players and a basic understanding of probability math.
Randomness in games can often be a fun addition because it leads to surprises and can make a boring game more interesting. But you also want to use with caution because you want your players to still feel like they are in control. Too much RNG can make people feel that the game is unfair.
Pre-built maps are good if you want people to be able to master them, and generated maps are good if you want people to think on their feet every time. Pre-built can make things predictable, whereas generated can add replayability.
As for symmetrical maps, do you mean both players start with an even playing field? If so, that's ideal for balance. If you do intend to give one player a map advantage, you'd have to properly balance the other player to have some other advantage. Imagine playing golf. The player at a disadvantage might be granted a handicap. The important thing is that both players must feel like they are treated fairly.
Edit: If you're really interested, I'd recommend The Art of Game Design by Jesse Schell. There's 2 excellent chapters in there about game balance that details probability math, good design, and player psychology when dealing with balancing.
I kind of sounds like you're whining.
go to /r/gamedev
If you know how to program effectively and you want to do something solo. Learn how to Art. If you know how to Art, learn better programming skills.
here's some of my favorite book recommendations
Programming:
Game Coding Complete
The fucking bible as far as books on game development goes. Made by one of the senior developers on the Ultima series. Seriously. Good book.
Game Engine Architecture
Also a really good book, teaches you more about usability beyond yourself if you ever find time or reason to expand your team.
Art:
Drawing on the Right side of the brain This is a very good text for getting you out of your comfort zone and into the mindset you need to have to do good art. This book won't teach you how to make good art, practice will, but its a good first step.
I'd also start looking around, take a look at Blender, we have a great community at /r/Blender and start learning how to do modelling, theres some great tutorials on the gamedev subreddit, as well as a number of classes on Programming and one on Game Concept art at University of Reddit.
Now get up off your ass and start building a game. Pixel. By. Pixel.
and if you have any questions, shoot me a pm, I'd be glad to help!
Since you've dipped your toes in the M$ stream, I would suggest working towards the 2012 MCSA. It's 3 exams and is the go to 'asked for' cert on sys admin jobs. Each exam is $150 and it will require you to lab on your own, among other things.
You mentioned Linux...the CompTIA Linux+ is comprised of two exams but you end up getting 4 or 5 certs altogether (but only 2 [L+ and LPIC-1] are worth a shit). If you've never worked with *nix before this one will be a challenge. Interesting fact: this cert never expires.
And then...the easiest of the beginner certs--CompTIA's Security+. This is also a standard for many junior security positions and is required for many federal government contracting gigs. Just buy Darril Gibson's book and watch Professor Messer's videos and you'll be good to go. This is only one exam.
The CCENT is the entry-level Cisco networking exam. I recommend Todd Lamle's book for that. Some might suggest getting CompTIA's Network+ first but I would recommend going straight for the CCENT, then CCNA if you like the material and want to get deeper into networking.
For all of these...yes, you will have to study. The MCSA 2012 will take the longest and the Security+ should be the shortest. Use your downtime wisely.
Edit: unless you're in a dire financial situation, certs are by far the easiest and most economical form of resume boosting...invest in yourself.
I wouldnt look down on you for it, but I would expect you to sell me. I've never personally used Blackboard so Im not sure where the skillsets overlap. You should be sure, and you should be able to talk about how that helps you transition. Write and practice your pitch.
The most important thing for a junior position is passion for the field. No expects you to be talk about POSIX and why you would use egrep over grep. They just want to see someone that is hungry and wants to learn.
Also, go buy the The linux command line. Its the best intro Linux manual I've ever read, and its intended for people with zero Linux experience to get up to speed. Its the second best value you will get for money spent on a book. The first best is Interviews for dummies. Im not joking when I say that I payed $1 for it at a used book store and its made me at least 15k dollars back. If you sit down and really learn both of these, you will be able to transition to a jr linxu admin role.
I think Arin likes The Art of Game Design: A Book of Lenses, Second Edition and either he or Jon liked Game Feel: A Game Designer's Guide to Virtual Sensation.
Personally my favorite game design resource is either Mark Rosewater's design articles or his podcast. I prefer his podcast but both covers most of the same information. MaRo is the lead designer for Magic: The Gathering so a lot of the articles are about MtG specifically or about tabletop games but nearly all the general design podcasts are worthwhile. Most importantly, he has around twenty years of successful (and unsuccessful) design under his belt, so he isn't just talking in vague generalities or theories. He has examples backing up pretty much everything he talks about including, and maybe most importantly, times he thought he was doing the right then and messed up. I think anyone interested in game design should listen to the "Ten Things Every Game Needs" and "20 Lessons" series. You can hear his GDC version of the 20 Lessons here.
*: But the absolute best thing you can read on game design is a gamemaker tutorial. Theory is useless without execution.
You would love C Programming: A Modern Approach.
The book gets into some pretty advanced stuff. From MAKE files, to programming idioms, to how to organize your code.
It's a really dense book, but super well organized, super clear for almost all topics (only two or three topics I needed to google), and most importantly very thorough.
I was reading the book to refreshen my C. Out of curiosity, I looked up common or important interview questions on embedded C, and pretty much the book nailed it down.
Only about half of the programming industry has a degree directly related to IT or programming. Most have college degrees in something, but in the end the most valuable thing to someone hiring in IT is skills. Once you have the skills, you just need to get noticed.
I would recommend you learn Linux administration and web development. (Or you could learn Windows too - I don't know Windows well so I can't comment on it. Linux and Mac OS X are somewhat more popular in the programming world, but if you're looking to get into IT, not programming, then Windows administration might be more common.)
A good book to learn Linux is "The Linux Command Line".
https://www.amazon.com/Linux-Command-Line-Complete-Introduction/dp/1593273894/
For learning web development, you could read "
Learning PHP, MySQL & JavaScript: With jQuery, CSS & HTML5"
https://www.amazon.com/Learning-PHP-MySQL-JavaScript-jQuery/dp/1491978910/
Codecademy would also really help you in here:
https://www.codecademy.com/
If you have any questions, feel free to PM me and I'll do my best to respond.
In my experience, languages are pretty easy to pick up once you know one. I think you'd be better off sticking with Java and exploring concepts, algorithms, data structures and certain frameworks.
When I was starting I got a lot out of the GoF Book. It's a C++ book but they don't really use any C++ features that are hard to translate to Java. I've heard good things about Head First Design Patterns too but haven't read it.
As far as Java goes Spring and Hibernate are two great libraries to be familiar with, since you'll encounter them in the wild pretty regularly.
If I were to suggest something you might not have learned, consider installing VirtualBox and using it to run Ubuntu. Familiarity with Linux will give you a big leg up and Ubuntu is a pretty good way to ease into it. Plus it has packages for a ton of different programming languages so you can experiment with any that catch your fancy.
I have the first edition and yes, it worth a read, keep in mind that it explain how game engines works and not how to make a game engine.
After reading it you will not be a master with UE4 but you will undertstand why UE4 do things in a certain way.
Another book you have to read (and is mentioned in your link) is the Game Programming Patterns book, i have the physical copy and it is awesome, read it after the GoF Design Patterns book, is a masterpiece combo.
EDIT:
Also two sites i want to suggest:
Learning Modern 3D Graphics Programming, is a great tutorial about OpenGL basics.
The Book of Shaders, great to learn how shaders works.
I completely agree with your observation that programming is more of a way of thinking than it is about knowing the syntax of a specific language. Yes, we may all have our preference or most used language, however; any programmer is going to have multiple languages that they know and it also is usually not difficult to pick up a new language once you're a programmer for that exact reason.
That aside, a quick google search brought this book up. I do not have this book nor have I read it, but it seems like a decent book for $15. Remember, there is no substitute for solving problems on your own though. The book may give you insight and hints and may give you a list of challenges with solutions, but you can also improve your problem solving skills by just googling "beginner programming challenges" and attempting to solve some of them.
Hope this post helped you, if you have any more questions feel free to ask or PM me :)
Best Regards,
Kevin
I hear ya man. I guess I'll vent with ya sorry for the long post.
I'm in the same boat 25 and don't know where to fully go career wise with a shitty job. I work in a call center scheduling boiler inspections, while dispatching for inspectors who also do an insane amount of driving at ridiculous times. But god damn 130 miles fuck that, and I thought my 40-45 min commute was bad! My hat is off to you guys for putting up with that amount of driving.
So after graduating college with a BA degree telecommunications thinking that I would get a job in that field such as network engineer/technician, line installer, PBX tech doing MACs (term for moves, adds and changes when programming telephones and other equipment) within the first 6 months of graduation. Yep that was a naive rookie mistake to when I found out all about CCNA certifications and all that other shit where you have to spend around $120 to take an exam after studying this book or you could spend another $3000 for that education. I wasn't ready for that after graduating in 2013. I was exhausted learning after 5 years of college (it was a 4 year program but I took it easy my sophomore year in college trying to figure what I wanted to do along with what would most likely get me a job that I could live off of while working part time).
All I can say is this after 2 years from graduating find what you can to get by, if you can't tolerate that job anymore find something else. It's really fucking hard I know I've been trying to get out of this call center position for nearly 7 months now. Before that call center position I was delivering pizzas for 8 months. Then when you can find a position that you can live off of and tolerate for a while then pursue that in your free time what you need to do for the career you want. Lately I've been getting into the crazy wonderful world of coding and web development. It's hard of course which means it's worth something, but I learn most of the material for free. If I told my 20 year old self that he would've said "Yea right grizzly adams had a beard." (feel free to end the joke). However, I haven't been learning that much code since I can't take this call center position anymore so I'm focusing on finding a new job away from this shitty boring area I'm in (King of Prussia, PA area it's boring suburbia). When I find a new position that I can tolerate where I'm not on the phone all day, then I'll pursue and develop skills on being a web developer and build a portfolio of a couple websites showing exquisite HTML, CSS, JavaScript, PHP, Python and jQuery skills then I'll start applying to web developer jobs.
So build my friend, it takes time but build there is still time.
Even though I wish colleges could help us out more career networking wise they just throw us out on the fucking street and ask oh do you want football season tickets? Then I say sure how about you get me a job you pricks and I may be entitled but when I pay $86,000 I expect results. I remember going to a college savings plan meeting and hearing the presenter saying "Colleges are first and foremost a business". Yea well I'm the customer, I went to college to get a career in telecommunications not to deliver pizzas and work in a call center.
If your goal is to practice code and just have fun, slinging low level game logic is really satisfying. (obviously if your goal was to actually make a game, or to make an actual usable/popular engine, you'd want to heed all the usual warnings)
Have you made a game at all before? I think a big part of making an engine is knowing a lot about what NOT to do. Especially early on (e.g. the first few YEARS of gamedev) there's a lot of learning the hard way. Make the core gameplay for some game, get frustrated because it's becoming a pile of spaghetti code, have a moment of enlightenment about better design, then start over from scratch. You'd probably be able to follow a "build your own game engine" book, but the lessons and reasons wouldn't really sink in without that personal experience.
Probably because of the above, many successful game engines simply start as a regular game. Good code gets reused, bad code gets refactored to make a second game. Repeat this often enough and you have sturdy, proven code that's evolved into an engine. Instead of trying to plan for infinite possibilities in the future, create what's actually needed for the next game (while attempting to not break the previous games). This has been working well for me so far.
But, feel free to jump directly into engine-making if it sounds awesome to you. It's still on my to-read list, but this book has pretty good reviews and might be up your alley.
Professor Messer for the best free online resource and videos.
Mike Meyers' Exam Guide for the best print resource. It's a book. Whatever price you decide to pay for it, or not, is up to you.
Of course there are other options and resources, but these were great for me. And there could be something else out there that works better for you. Either way, hope this helps and good luck!
Ok, but why should somebody work with you if you've barely done any work on your own idea? Like /u/Bastiaan-Squared mentioned, most people are more excited to work on their own ideas, which they are constantly prototyping, refining, reworking etc, than to help you sit down and decide what mechanisms might work well in whatever setting you think is cool. You're better off spending your own time hammering out some potential mechanisms you might find interesting then approaching somebody and refining what you've done.
Here are a couple books that might help you out:
/u/rampion already made a great recommendation of Charles Petzold's Code that I highly recommend. Another great one is Tao Te Programming which is barely a book (in terms of length), but is available for free online.
I also really loved Game Engine Architecture but obviously that's pretty niche. I have more and will do my best to add them later
You need to learn architecture. For this do NAND2Tetris and get some used architecture textbooks from the computer engineering department.
Caches are a big deal. People forget they exist, but you're going to need that knowledge in embedded. DMA's, or even normal memory reads, might only be coherant with some cache levels. That sentence should make you gag.
It gets worse when you start to think about concurrency; which you should, frequently, because it isn't the 90s anymore.
Get used to debugging. A lot. Learn practices that make that easier. I mean both learning archaic shit like
ddd
and writing unit tests, following best practices, etc. In embedded you're going to be violating best practices often, but it is important that this teaches you "... so the rest of my code is as clean as possible" than "... what's one more sin next to so many?".Most architectures are the same nowadays but the GPU is a notable exception (though less and less each generation). Learn CUDA - use Udacity's course on the subject.
What every programmer should know about memory.
Start writing projects in C++. Go ahead and become a real C++ nerd.
constexpr
everything you can. You don't need other languages except maybe barebones Python, Bash, and the Turing complete language known as the Preprocessor. You'll learn ~what you really need to know of C from C++.Get very familiar with 'Godbolt'.
Write for maximal performance. This is a dying art. You'll have a competitive advantage if you're good at it. If you don't become filled with rage by the word "premature" you're not optimizing enough.
Profile your damn code!
Profile your damn code, but with a different link this time!
Know your latency numbers.
Make SIMD a part of your daily life. You might not always have vectorization, but this is the easiest way to show you're capable of exploiting hardware features.
Computer graphics people are relatively well-respected by the embedded software community, and there is a lot of overlap as they use similar skills. Taking a detour through graphics is a good idea even if you don't plan to work in graphics. It's fun, too!
One way or the other you have to find a relevant application domain and solve problems in it... if not graphics try: video game programming, GPGPU, robotics, control systems, computer vision, animation, networking, VR/AR, and a bunch more.
Do not put VHDL or Verilog on your resume without first being sure you're masochistic enough.
Learn to start being very choosy in what advice you listen to. Most people solve problems under a totally different set of constraints, and what they'll preach until the sun burns out might be pants-on-head stupid for you.
You might already have picked up some of those funny ideas from being a web dev, so be on the watch for that.
The book Game Engine Architecture has a lot of real world wisdom from a much more relevant view, so read it.
Also, most people are taught in a way that is not really beneficial to an aspiring embedded SWE (e.g. Java schools). Most people have to learn that type of stuff as they mature as a programmer... hence the requirements. You can be hired into these types of positions right out of university, but you have to show a knack or focused interest in it.
And to be frank, it is just plain harder than web dev or slapping CRUD apps together, so fewer fresh grads would be able to do the work well even if they followed the 'right' path in university.
You can get some experience by writing on an embedded platform, but unless you want to probably shouldn't. The principles I am describing are more important.
Do one or two solid projects. Not dozens. Not perfect. Not amazing. Just one or two simple-but-pretty-good things in your portfolio, that show that you are not just a web dev or Java School Student.
Get relevant work experience as early as possible. Relevant means same skills, not same application domain.
Remember, it being hard isn't a bad thing. It is a barrier to entry that once you cross becomes a competitive advantage. The harder it is, the greater the advantage. Always double down on the hard technical skills.
Writing an engine isn't a trivial task. I don't mean to put you down or make you feel bad but it kind of sounds like you don't totally understand what a game engine does.
If you do want to write an engine, I would suggest starting with the renderer and expanding your understanding from there. The features of your engine depend upon what kind of game features you want to support. Particles? Visual effects? 3D sounds? Dynamic Resource management? and all of that behind the gameplay code.
Just get a square to show up on the screen. While you're working on that, check out a few books on game engine programming. There are a ton on amazon. This one is really good:
http://www.amazon.com/Engine-Architecture-Second-Jason-Gregory/dp/1466560010/ref=sr_1_1?ie=UTF8&amp;qid=1453134607&amp;sr=8-1&amp;keywords=game+engine+architecture
If you need some more help getting started let me know! Engine programming is fun and rewarding but building one from scratch can be a monumental task.
Interesting!
Looks to me that you can "feel" what good code looks like but you're not able to rationalise it enough for you to write it on your own.
Couple of suggestions:
When you see elegant code, ask yourself: why is it elegant? Is it because is simple? Easy to understand? Try to recognise the desired attributes so you can try to reproduce on your code.
Try to write really short classes/methods that have only one responsibility. For more about this, search for Single Responsibility Principle.
How familiar are you with unit testing and TDD? It should help you a lot to write better designed code.
Some other resources:
Although I admire the optimism for a lot of people here I feel they are not being very realistic. Like the mention of using sales experience to 'sell' yourself to employers: it's fine and dandy if you can bullshit your way into a job but if you can't actually deliver you'd be 'let go' within a month.
Learning a language is just one aspect. What's most important is doing actually a ton of programming. So make sure you have at least 3 moderately big projects with good code quality that follow best practices that you can show to employers.
Feel free to hop over onto /r/javahelp to have us review your code and suggest improvements. Being a developer isn't really about languages: it's about turning a customer's problem into a working solution. That's the hard part.
One last tip: for someone without any CS education but who is going into an area where OO skills are a must this book is a must read: http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented-ebook/dp/B000SEIBB8
Heck. Showing an employer that you read and understand it and apply it in your projects would give you a huge head up.
To get you acquainted with some of the basics, I recommend starting out with Codecademy's Python course.
Then perhaps move on to auditing this Intro to Computer Science 6.00 from MIT. It's completely free, has all the lectures as video, assignments and quizzes as PDFs.
Check out this playlist from a separate MIT course for the Recitations. Since this is also a 6.00 class the recitations are still relevant for you, and I recommend going over them as well once you've covered the appropriate material. (Or you could simply take that class)
Both codecademy and that class use Python 2.x, which is a bit different from today's 3.x, but honestly not so different that you can't learn from them (it seems basically the same to me except for a few expressions).
If you like books, I picked this one up after some research. Learning Python by Mat Lutz 5th ed. Pretty big textbook, about 1600 pages, but it's pretty clearly written and has a lot of exercises. It's also only $40 bucks so that's a plus.
A lot of people also recommend "Learn Python the Hard Way", but I haven't been using it.
There are not enough research papers specifically on gaming addiction because gaming addiction together with social media and pornography falls under the umbrella of internet addiction - Like you said a rather new field. Some breakthroughs are being made in the last years to have it recognized as an addiction per se (at least in Europe) the problem with conducting enough research is that there are no funds and insurance companies have no wish having another area of responsibility to potentially give away money to people suffering from it. If gaming addiction become completely recognized by international bodies of medicine then insurance companies might have to pay preexisting clients for passed and current treatments ---> something they definitely do not want to do.
Nonetheless here are some videos of legit men of science (not some random ex gamer) that research the field.
"Here is a short interview with Dr. David Greenfield talking about some of the mental and physical applications of gaming and internet addiction"
There are also longer talks on his channel like this one.
Dr. Greenfield has been researching Internet addiction since the 90's.
"Dr. Klaus Woelfling, from the University of Mainz. Germany is taking steps in treating Internet addiction and especially gaming addiction" - this one is a difficult watch primarily because the speaker is very uncharismatic (try watching with the speed setting on 1.5).
Last but definitely not least is "Your Brain on Porn"
Yes, yes I know, you might not want to hear that another of your favorite pastimes is bad for you, but this video covers on a very scientific basis the damages that watching excessive pornography causes to the brain, and no this is not some kind of NoFap cult propaganda, it speaks only on the subject of internet porn. Like I said before, porn together with gaming fall under the umbrella of internet addiction because the reaction we receive from these negative habits has the same structure. If you actually watch the Your Brain on Porn video you will hear him mention numerous times that the damages caused to dopamine receptors is similar to the ones cause from gaming and extensive internet use.
This is just some of the evidence done by men of medicine and science from the top of my head. If you want to go deeper I'd recommend The Shallows: What the Internet Is Doing to Our Brains By Nicholas Carr an American author and Pulitzer Prize winner (for that book), witch contains truly numerous examples of scientific studies and references you might want in the bibliography.
Also The Brain That Changes Itself by Norman Doidge M.D that talks mainly about brain plasticity and how different behaviors and habits cause the brain to form new cells , create new neural pathways etc etc . He also gives lots of examples how positive and negative behaviors causes various changes IN THE BRAIN, Internet addiction stuff included.
If you really want proof and not just searching for a reason to dismiss things you dont like the sound of then I hope this comment will serve you. If you do nothing less at least watch the first interview with Dr. David Greenfield. It is only 6 minutes long.
Hope this post that took me 50 minutes to put together and find all the links, will be of service to somebody.
Peace.
Edit: Grammar and formatting
Thanks for the additional information - I didn't know what language OP would be working in, but I imagine it would be probably at least predominantly Java.
/u/amazon_newgrad - to add to my suggestions, if you want to get better at the ins-and-outs of Java, I would recommend the following books:
java.util.stream
package, but it covers a lot of good practices that are still relevant.java.util.concurrent
package.Here's my list of the classics:
General Computing
Computer Science
Software Development
Case Studies
Employment
Language-Specific
C
Python
C#
C++
Java
Linux Shell Scripts
Web Development
Ruby and Rails
Assembly
Glad my feedback was useful.
Thinking in terms of simplicity doesn't necessarily make for a better game. Fun should probably be more of a focus.
I definitely wouldn't say that I had "fun" or was hooked by your prototype. Creating fun in game design can often mean designing a good game loop. You game loop right now is 5 seconds long, consisting of "press a button for 4 seconds". Not very interesting or rewarding as it stands.
Here's a book I highly recommend:
https://www.amazon.com/Art-Game-Design-Lenses-Second/dp/1466598646/ref=sr_1_3?ie=UTF8&amp;qid=1537819025&amp;sr=8-3&amp;keywords=game+design
It's all about game design, independent of coding or anything else.
If you study for it seriously, it's very doable. I'd also suggest CBT nuggets (though it is a bit on the expensive side, but Jeremy Cioara is an excellent teacher). Also, I consulted Todd Lammle (http://www.amazon.com/CCNA-Routing-Switching-Study-Guide/dp/1118749618) book for my CCNA and I personally think it's the best book that I came across for the exam. You should consult a few books and see which one works best for you. I'd highly suggest GNS3 or packet trace for lab-experience at CCNA level. Good luck with your plans.
which books exactly, please guide me.
these ones?
Effective C++: 55 Specific Ways to Improve Your Programs and Designs (3rd Edition)
Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14 1st Edition
More Effective C++: 35 New Ways to Improve Your Programs and Designs 1st Edition
What is the difference between them? It seems effective cpp 3 is from 2005 and more effective cpp is from 1996. Is there a point in reading more effective cpp after reading the third edition of effective cpp?
Also, what do you think about C++ How to Program?
It may not be a source as simple as just a link, but I have been studying for the CompTIA A+ exam and they go over a lot of this stuff pretty well. If you get any of the textbooks or look up some of the online study guides, they will have a decent amount of information on these topics.
This is the textbook I have been reading recently. It has a ton of information about the different technologies and standards involved in each component, and can really make those specifications you see on your hardware make sense.
I have been really happy with my new-found ability to look up something complex, like a motherboard, and understand the advantages and disadvantages almost immediately.
Professor Messer also has a popular guide for the A+ in a pdf format, but I have not used it and cannot vouch for it being what you seek.
Good luck!
The senior part is more of a technical grade level and not necessarily management... granted I'm in the lead role here, it's my first time as one. All I can say is what help me spring forward at a lull at mid-level was picking up Thomas Limoncelli's books, [the sysadmin one] (https://www.amazon.com/Practice-System-Network-Administration-Enterprise/dp/0321919165/ref=sr_1_1?ie=UTF8&amp;qid=1512041042&amp;sr=8-1&amp;keywords=thomas+limoncelli) and [the cloud one] (https://www.amazon.com/Practice-Cloud-System-Administration-Practices/dp/032194318X/ref=sr_1_3?ie=UTF8&amp;qid=1512041042&amp;sr=8-3&amp;keywords=thomas+limoncelli) /r/sysadmin recommends them too. These are your best practice books, these tell you why to do things, not how. It will turn you from being the guy that mops the floor in a burning building into knowing when to yell, "FIRE!"
Cert wise, unless a specific company or contract requires it, I don't bother with the time and money on certs if you already have years of experience on the books. I'd probably go for a Security+ and then go for a Red Hat and/or CCNA certification as they are both prestigious. Red Hat is a big deal just by its practical application test.
If you want to go into cloud related stuff, you might want to brush up on your programming. This is what is limiting me, I have very minimal bash scripting experience coming from military in the Windows world then making a move to Linux.
Honestly, I would focus on being both as they both overlap very often unless you are in really large stovepipe enterprise environments, but you never know if you need to make a move to something smaller where you have the many hats role. I'd get your degree in something Computer science related (CS, CIS, EE, CE, etc) and then go RHCSA/CE and maybe Sec+/Net+ or instead of Net+ just go for something Cisco related. My networking is Net+ strength at best and I resent not doing better when I was younger.
EDIT: Also, if you can do the math, BS is Computer Science all the way... sysadmins are still really kind of not doing well in the degree program department, mainly because were so... trade-like I guess. Honestly, we're the new Millwrights like my dad was. We keep the factory going and fix it when production stops. It's kind of cool actually, it's nice to be able to have some kinship to my dad in that way.
Since some other people are trying to be cute, start with this wikipedia page here: https://en.wikipedia.org/wiki/Software_design .
I don't know of any online tutorials for the process of game development, but I am aware of a book named Software Engineering for Game Developers which goes over the process, step-by-step, of designing, outlining, and implementing the software part of a game. Note that this is one of the most dry, boring books on games I have ever read, but it's not about game design, it's about game development, and outlining software requirements is not a topic many people get excited about.
Basically, they go through the process of creating a requirements document which is a glorified to-do list of everything that the game needs to do, dividing those specific requirements into "stripes" which are different levels of completeness of your game, and then from there deciding on the best way to chop up the concepts into objects. The book is a monster 1000 page beast, but if you're serious about needing a step-by-step process, you won't get better than this.
My suggestion (if you don't purchase or, ah, otherwise obtain a pdf of the book) would be to simply start with this glorified To-do list that lists every feature your program should have in version 1. Then write up all the subfeatures that those features will require. Then divide all these items into groups where it makes sense and make each group an object (or object hierarchy). Do some research and see what parts might already exist, such as rendering, graphing, input, GUI, or serialization libraries, and incorporate them into the design. If you don't know what, exactly, goes into a game, try looking up a book such as Game Engine Architecture which will outline all the different parts that a game engine needs.
Then write the program.
Note where your design was insufficient or flawed, and don't worry about keeping the list intact--add or remove items as needed. Wash, rinse, repeat: the more you practice this on new programs, the easier it will be as you gain experience with what needs to be written out and what can be ad-libbed. The more advanced tools (such as UML et al) will be useful later, when you have more complex projects with more moving parts, that need to be explained to other programmers.
Until then just stick with lists.
There are quite a few good book on this topic, that I would recommend, like Jesse Schell's The Art of Game Design, or Justin Gary's Think like a Game Designer. These books describe the process way better than I ever could, but I'll try anyway.From my personal experience I always start from an idea (hey, wouldn't moving fortresses be awesome?), then I start to think about what exactly fascinates me about that idea. Then I try to capture the awsomeness in game mechanics. From there I create a list of what has to be done to test the mechanics, do that (plus some eye-candy because I'm a visual person) so I have something to test. When I have something to test, I try to analyze what doesn't work and fix that (not in code, but in paper). And start the process again.
So basically once I have an idea, it's this loop of creating/refining mechanics, implementing them, then testing and analyzing them. Then I go back to refining.
If you often suffer from scope creep, there are several methods to battle that. Like setting yourself a deadline, always cutting a mechanic when you add a new one, etc. Don't be afraid to throw something out (it's not lost you can use the idea/mechanic in another project). A game is way better when it knows what it wants to be and throws away everything that doesn't contribute to that core experience (I mean they could add RPG elements to Call Of Duty Campaigns, but they don't because that's not what the game is about).
Also if you don't like your code, that's 100% normal. when you look back at something you've made, you'll always be able to spot something that you would do differently now. That's because you've learned new things since you started . I'm programming for nearly a decade now, and when I look back at code that I've written a few months ago I'm always like "Eww, why would anyone write code like that?". So don't be afraid to make mistakes and don't continuously refactor code. Make something, learn from it and do it better next time.
I hope that helps!
&#x200B;
EDIT: spelling
I type too much so I needed a second post
---
> And lastly, do you have any sources that you used to read up on multithreading?
I recommend doing the following:
If you know Java and want to see all the ways you can strangle yourself, this book has a lot of great things in it. It's quite readable and will likely scare you (for good reason...) into how dangerous multithreading can be. The book is hefty and requires Java, but the information is very practical.
If you want CSC369 notes from a really good textbook, the following chapters are relevant:
http://pages.cs.wisc.edu/~remzi/OSTEP/threads-intro.pdf
http://pages.cs.wisc.edu/~remzi/OSTEP/threads-api.pdf
http://pages.cs.wisc.edu/~remzi/OSTEP/threads-locks.pdf
http://pages.cs.wisc.edu/~remzi/OSTEP/threads-locks-usage.pdf
http://pages.cs.wisc.edu/~remzi/OSTEP/threads-sema.pdf
http://pages.cs.wisc.edu/~remzi/OSTEP/threads-cv.pdf
http://pages.cs.wisc.edu/~remzi/OSTEP/threads-bugs.pdf
http://pages.cs.wisc.edu/~remzi/OSTEP/threads-events.pdf
You can casually read the above. You don't need to actively code or anything... and the style is very laid back and enjoyable to consume. Each chapter should take you ~40-60 minutes to do, so you can do one a day over the summer and be done in a week.
If you want the 369 notes, these are relevant lectures which cover the above chapters:
http://www.teach.cs.toronto.edu/~csc369h/winter/lectures/w3/L3-Synch.pdf
http://www.teach.cs.toronto.edu/~csc369h/winter/lectures/w4/L4-Synch.pdf
The above may be a good refresher after you've done the textbook spam I posted above.
All of these links are from the CSC369 webpage here: http://www.teach.cs.toronto.edu/~csc369h/winter/lectures.html
LASTLY make sure to read up on the language you plan to use and explore its concurrency library.
Now that you have the knowledge, go write something that does this. Find a cool topic where you have tasks that could use multiple threads to go faster and make some cool stuff.
=============================================
Some final notes because this took a while to type up and I have to go have lunch:
I didn't proof read anything so enjoy the typos, spent too much time writing posts
EDIT (I lied): Don't forget that luck plays a large factor in the interview, you can have everything and you could be asked some stupid question. Therefore it's not worth killing yourself over since you could grind like mad and have luck just not be on your side (and this is why you should apply to as many companies with interesting jobs as possible)
I'd start with this article. Finding newer versions of the books mentioned here is going to get you going on the right path. Here's a few I've picked out that I've personally read over the years.
Java: A Beginners Guide - Doesn't really get much better than this as far as an introduction into Java. Clean examples, pretty easy to follow. Would be a great place to start
Effective Java - This has historically been an excellent reference for Java. It's not entirely beginner friendly, but if you have at least a working knowledge of Java it's an excellent book to have around. Note: The link is for the 3rd edition which is coming out soon, I assume it will be as good as the previous editions, but in any case the information from the previous editions is still worthwhile even if there are newer features in Java 7/8/9 which is covered by the 3rd edition
Java Concurrency in Practice - As you become more advanced this book can help guide you along the ways of concurrent operations in Java and pitfalls/issues you'll run into (and how to avoid them)
I'm working on a large OpenGL tutorial site that is specifically aimed at beginners trying to learn modern OpenGL with clear samples and easy-to-understand sections. It's not finished yet but should provide a good resource for getting started and getting a hang of shaders. Take a look at www.learnopengl.com and see if it's something that suits your needs :)
Also, take a look at:
Real-Time Rendering: great book on modern OpenGL with a focus on shaders (although not specifically aimed at complete beginners).
Open.gl: good resource for starting modern OpenGL. Easy-to-understand.
Arcsynthesis tuts: very extensive OpenGL tutorial that goes into much more detail, making it more rewarding, but also more complicated for beginners.
Well, I pretty much hate it, but if you really wanted to you could pre-plan your projects using UML. You can find some free UML editors online if you look. ArgoUML is okay, but definitely needs improvement (like an undo feature).
Also if you are interested in programming patterns, the canonical text is the GoF book. If you search I'm sure you will be able to find a PDF version of it. There is also a website dedicated to talking about the same book in terms of the application to games:
http://gameprogrammingpatterns.com/contents.html
I find tutorials to be decent for learning how to perform simple tasks which don't require much variation or novel problem solving. As it turns out, making games is pretty much the exact opposite of that. I know from experience that it can be frustrating to find information on stuff like architecture and system design for games, but a lot of that is pretty much tribal knowledge, learned by professionals on the job or by hobbyists as they make projects.
I recommend reading articles on Gamasutra for more advanced topics, and I also recommend the book Game Engine Architecture by Jason Gregory. I think really the best thing you can do is try to do a more complicated project and as you run into problems you have trouble solving on your own, then research that specific topic. It's worth trying to solve the problem on your own first though, as while it may involve reinventing the wheel somewhat, it's also the best way to learn.
Scott Meyers is good -- check out Effective Modern C++. He has a training course, Overview of the New C++ -- I haven't taken it, but I've seen enough of his stuff to recommend him.
If you want more introductory C++ stuff, look at some of the online courses by Kate Gregory (some free trials available -- which might be good to assess if it's what you're looking for).
Once you get going, I'd recommend Sutter's Mill. In particular, check out his "Elements of Modern C++ style". There are also loads of videos online from CppCon (just google it).
But keep in mind that one limiting factor in your request is the "for C programmers" part. A big part of recent evolution of C++ has been getting rid of the need for core C features like pointers. By keeping the C angle, you may be anchoring yourself to the past.
And if you want to go that route anyway (ie keep the C angle), then there is less harm including some older stuff too. I really liked Bruce Eckel's Thinking in C++, which you can find online for free (it isn't quite ancient or modern).
If you want to program in Java, I would also suggest IntelliJ Idea. Community edition^[1] is free. Oracle docs are fine^[2], javadocs^[3] are great and the source is free for OpenJDK and if you want to go pro I highly recommend Effective Java^[4] by Joshua Bloch. There is also Findbugs^[5] which is cool for static analysis and most of the popular IDEs have plugins for it. You should also check Concurrency In Practice^[6] for multithreaded programming. If you are into web programming, I highly suggest Head First Servlets and JSP^[7]. There are also very good libraries such as Google Guava, Apache Commons etc.
The object you're interested in is the call graph of the program. As you've observed, this is a DAG iff there is no recursion in the program. If function A calls B and B calls A, this is called mutual recursion and still counts as recursion :)
A related graph is the control flow graph (CFG) of a function. Again, the CFG is a DAG iff the function doesn't contain loops.
An execution trace of a program can certainly be represented as a DAG. In fact, since an execution trace does not have any branching, it is just a straight line! However you are very rarely interested in a single trace through a program -- you usually want to reason about all the traces. This is more difficult because if you have any looping structure in the global CFG, there is no (obvious) upper bound on the size of a trace, and so you can't capture them all with a finite structure that you can map into SMT.
Every program can be put into SSA form. The trick is that when you have joins in the control flow graph (such as at the head of a loop), you need a phi node to fix up the SSA indices. If you don't have it already, the dragon book is pretty much required reading if you're interested in any kind of program analysis.
In general, if you have a loop free control flow graph of any kind (a regular CFG or a call graph), then you can translate that graph directly into SAT or SMT in a fairly obvious way. If you have loops in the graph then you can't do this (because of the halting problem). To reason about programs containing loops, you're going to need some more advanced techniques than just symbolic execution. The big names in verification algorithms are:
A good overview of the field is this survey paper. To give an even briefer idea of the flavour of each of these techniques:
Bounded model checking involves unwinding all the loops in the program a fixed number of times [; k ;]. This gives you a DAG representing all of the traces of length up to [; k ;]. You bitblast this DAG (i.e. convert it to SAT/SMT) and hand off the resulting problem to a SMT solver. If the problem is SAT, you've found a concrete bug in the program. If it's UNSAT, all you know is that there is no bug within the first [; k ;] steps of the program.
Abstract interpretation is about picking an abstract domain to execute your program on, then running the program until you reach a fixed point. This fixed point tells you some invariants of you program (i.e. things which are always true in all runs of the program). The hope is that one of these invariants will be strong enough to prove the property you're interested in.
Predicate abstraction is just a particular type of abstract interpretation where your abstract domain is a bunch of predicates over the variables of the program. The idea is that you get to keep refining your abstraction until it's good enough to prove your property using counterexample guided abstraction refinement.
Interpolation can be viewed as a fancy way of doing predicate refinement. It uses some cool logic tricks to do your refinement lazily. The downside is that we don't have good methods for interpolating bitvector arithmetic, which is pretty crucial for analyzing real programs (otherwise you don't take into account integer overflow, which is a problem).
A final wildcard technique that I'm just going to throw out there is loop acceleration. The idea here is that you can sometimes figure out a closed form for a loop and replace the loop with that. This means that you can sometimes remove a loop altogether from the CFG without losing any information or any program traces. You can't always compute these closed forms, but when you can you're in real good shape.
Drop me a message if you want to know anything else. I'm doing a PhD in this exact area & would be happy to answer any questions you have.
Effective C++ / Effective STL by Scott Myers are a good starting point. They can be hard - if they are not, come back in a few months.
Marshal Cline's C++ FAQ is an assorted collection of everything in small bites. The book makes excellent toilet table material, though you have to piece together yourself the deeper insights that Effective X aims for.
Guru of the Week is a sometimes-dated but very well presented series of questions and answers, aiming at a wide range from beginner to, well, guru. The only drawback is that in C++11 and beyond, it's a bit different, or there are other / easier solutions.
Herb Sutter has started reviving the series
Code Complete gets half-a-recommendation. It is important material about programming in general, but for most people it's just too big. Anyway, the first edition can be acquired for pennies and is "good enough", so in case it doesn't work for you it could keep you warm for half an hour or so (lighter not included).
---
Other than that: I repeat the recommendation by /u/Heiroglyph to read and try to make sense of other people's code.
---
Side Note: My recommendations are intentionally non-game-programming related. Reason is^* I had quite a few run-ins with game programmers on Q&A sites and the like, and I'm left with the impression that they have a culture of sticking to their own puddle, but thinking it's the ocean. Certainly, game programming has some very particular problem that need very specific and sometimes awkward solutions, but that's no reason for isolaitonism.
^^*) ^^besides ^^the ^^obvious ^^"I ^^am ^^doing ^^too ^^little ^^game ^^programming ^^to ^^be ^^of ^^use ^^for ^^that"
Well it sounds like its time to start prototyping and analyzing what does and doesn't meet your documents/requirements. Getting these out should motivate your team and make you feel a bit more confident in what to do next.
As far as looking for resources, there are quite a few out there. I really recommend checking out The Art of Game Design by Jesse Schell, it's one of the most practical books on game design (a lot like Raph Koster's are way more theoretical). I'd also check out gamasutra for a great design-focused community, there's a lot of resources there that can help you out.
Also, don't worry if everything falls apart. Game design is a lot of work and people can tend to be pretty flaky about it. That's why I've tried to learn every aspect of development so I don't have to depend on others.
Start off with Codecademy. It gives a basic overview on various languages used in Web Development, Web Design, Site Building, Basic Console Applications and a few languages used for various things. It's free and gives a very basic standpoint on Programming. It should take you 2-3 months to finish all the courses and by that time, you should be ready to start your own small projects.
---------------------------------------------------
Next, you should look onto buying books. It really depends what you want to get into. For making websites, you should learn HTML, CSS, JavaScript since they give most functionality and are very easy to remember (all of which are curses on codecademy). If you want a challenge, you should consider Computer applications that use C, C++ or C#. However, That is not recommended for a person with no experience. iOS development is a great way to pick up new skills. Should you want that, you're limited to using an Apple computer, Apple-dev software and development licenses (which can all be costly).
--------------------------------------------------------
Use the list below for sources on the stuff I mentioned:
Codecademy [https://www.codecademy.com/learn/all]
Learning Web Development with this great book [https://www.amazon.com/Web-Design-HTML-JavaScript-jQuery/dp/1118907442/ref=zg_bs_3600_3]
Lastly, I'm uncertain you can pull off a great software with only online courses and reading a few books. Programming is a very complex process, that requires money, energy, and a whole lot of time. But if you stay consistent and practice every single day, I'm confident you can do this.
Contact me privately for any questions. Good Luck!
I know books seem out of style, but a thick book on front end web development is worth a thousand crappy blog posts. If you think HTML and CSS are fun wait until you see what JavaScript can do. THEN see what backend code and databases can do.. truly fun.
Here is a nice set of books. I have these. They are pretty basic, which is perfect for where you are right now. They are also really visual. I'm a visual person, so I appreciated the diagrams and such.
HTML, CSS, JavaScript with Jquery
Yeah man, no problem.
Before I find some specific books, I wanna mention one series that you've definitely heard of: Blank for Dummies. From my experience, if you want to start from no knowledge and work up to an intermediate level of understanding, For Dummies books are great. A lot of experts beg to differ.
But, to be frank, people who are experts in their field are just that: experts in their field. I have friends who are excellent in their fields, but they are terrible teachers. They expect people to pick things up as quicky as they did. We're not all wired that way, and For Dummies books get that.
So, for my first two recommendations, here ya go:
Networking for Dummies
Building Your Own PC for Dummies
Both of those are less than 20 bucks on Amazon, and I'm sure you can find them at a library.
Now, if you really want to get into networking, and you want to get in to the IT field, you should read the A+ and Network+ certification books from Comptia. These will be harder to find in a library, but there will probably be some older editions lying around somewhere. If you know someone who works in the field, they probably have a copy, or can get you a copy, for free or cheap.
These books are more expensive, and more difficult, but they are peerless if you want to jumpstart a career in IT. I'm not going to claim that getting an A+ and/or a Network+ (or a Security+) certification is going to guarantee you a job. However it will definitely help you get your foot in the door.
Other books that you'll want to eventually check out if you want to check out things from O'Reilly. Most of their books are not meant for beginners, but they are the quintessential reference books in the IT field, including computer science, networking, and security. To give you an idea of just how many books they have, check out this picture of the programming section at the Noisebridge Hackerspace in San Francisco.
That band of colorful books in the middle? Those are (some of) the programming books they have available. They have just as many on every topic of IT. Here's their networking section. 19 pages. Of just networking books.
I hope that gives you a good idea of where to start.
When I started getting interested in compilers, the first thing I did was skim issues and PRs in the GitHub repositories of compilers, and read every thread about compiler construction that I came across on reddit and Hacker News. In my opinion, reading the discussions of experienced people is a nice way to get a feel of the subject.
As for 'normal' resources, I've personally found these helpful:
In addition, just reading through the source code of open-source compilers such as Go's or Rust's helped immensely. You don't have to worry about understanding everything - just read, understand what you can, and try to recognize patterns.
For example, here's Rust's parser. And here's Go's parser. These are for different languages, written in different languages. But they are both hand-written recursive descent parsers - basically, this means that you start at the 'top' (a source file) and go 'down', making decisions as to what to parse next as you scan through the tokens that make up the source text.
I've started reading the 'Dragon Book', but so far, I can't say it has been immensely helpful. Your mileage may vary.
You may also find the talk 'Growing a language' interesting, even though it's not exactly about compiler construction.
EDIT: grammar
I'd start with Harvard's CS50 on edx, it's the best course you'll find anywhere bar none. The instructor, Dave Malan is world class. The first half of the CS50 lectures are on C and on youtube. There's also r/cs50.
Also, the Richard Buckland lectures are all up in youtube as well, really good intro to C programming. People love this guy!
Here is the Aalto C Programming MOOC based on K&R.
You can learn C, all you need is a text editor (like notepad or sublime), and the terminal/command line. You don't need any internet connection whatsoever.
I recommend getting this book C Programming: A Modern Approach, it's great for beginner's, and you can try going though the examples. You can also try going through all the problem's in K&R's C Programming (what many refer to as 'The C Bible') book if you want to be a C Ninja.
Here is a guide on how to compile C programs on a Linux system.
You can find used copies or PDF's of these books online if you don't want to pay full price. I like having a hard copy in front of me when learning as I can flip back and fourth quickly.
Since you want to learn C - you should read K&R's The C Programming Language (the bible for C) at some point.
Hi i personally loved Web Design with HTML, CSS, JavaScript and jQuery Set. Have really good examples and easily explained concepts which i think is cornerstone for programming itself. Also don't get discouraged if you don't remember things, is totally normal that you have to go and look for definitions, code snippets, etc . The more you code the more you learn, as easy as that, remember that and your life will be a lot easier. Happy coding!!!
Edit: Also practice, practice and practice more. Here's a link to my favorite coding challenges page.
You didn't post a question, so it's difficult to know what exactly you want. If you just need to implement space partitioning with a BSP tree, read the good old BSP FAQ
If you need more general graphics background, check out:
If you have more questions, please be more specific. I might help you with more resources.
When I said "I can see how maybe they could be useless to you.", that's because I instantly know what kind of programmer you were. You're a low level guy.
I have a copy of "Algorithms in a Nutshell" (http://www.amazon.com/Algorithms-Nutshell-In-OReilly/dp/059651624X) but I never finished it. My favorit programming book may be "Patterns of Enterprise Application Architecture" (http://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420). Neither of these books are language specific, but I don't think they could be further apart in every way. Both are very valuable and I appreciate that they both exist.
There is a good number of reasons that you should maximize your use of the built-in PHP functions (http://webandphp.com/5reasonstomaximizeyouruseofPHP%E2%80%99sbuiltinfeatures). My book is an attempt to come up with a system that will help you learn all of the built-in PHP functions by giving a realistic use case that could be applied in your everyday work.
Being a PHP programmer, it is much more useful to know what functions PHP has for array sorting, than it is to know how to implement array sorting in PHP code.
The CCNA curriculum is a great way to get a solid networking foundation. Many will recommend the Network+, but I certainly think the CCNA is a better certification track. I recently went through Todd Lammle's CCNA Study Guide in less than two months and passed the CCNA Composite.
http://www.amazon.com/CCNA-Routing-Switching-Study-Guide/dp/1118749618/ref=sr_1_1?ie=UTF8&amp;qid=1413474786&amp;sr=8-1&amp;keywords=ccna+study+guide
The great thing about this book is you can opt to go the ICND1 and ICND2 route, or just go for the composite exam. It's up to you.
GNS3 is excellent for practicing in a lab environment if you do not have your own equipment.
Andrew Crouthamel has a good series on youtube for videos.
https://www.youtube.com/channel/UCQZc6wrc__wo9oYOqvi9N_Q
They are a little dry, but free.
Install Gns3 (with some IOS images if you can get some) or packet tracer you can find a copy here http://getintopc.com/softwares/network/cisco-packet-tracer-6-1-free-download/.
There are some practice labs here http://www.packettracernetwork.com/labs/packettracerlabs.html.
You can get Todd Lamel book for self study as well.
http://www.amazon.com/CCNA-Routing-Switching-Study-Guide/dp/1118749618/ref=asap_bc?ie=UTF8
Hope this is helpful. Best of luck.
It's a great course, doing well in it would definitely give you more confidence in taking up more challenging problems in the CS or Software Engineering domain in general. I would recommend you to go through Data Structures chapter in the The Algorithm Design Manual by Steven S. Skiena, also a great book to study about Algorithms. This book is an amazing read and I recommend it to all CS majors.
STEM jobs are highly sought after nowadays and will continue to grow in the future. If you have a degree in computer science or medicine you're golden.
I'm 25 now and I work in the architecture field. I'm not an architect but simply a CAD operator, so I'm basically at the bottom of the barrel as far as pay. One of the things my ex told me when she broke up with me (the reason I came to TRP in the first place, surprise surprise.) was that she didn't think I wanted more in my life. That really set me off and stuck with me because at the time she was right.
Now I'm applying to schools. When I was 18 I originally majored in CSCI but didn't apply myself and dropped out. Now I've made it full circle and would really like to get back into it. I've only completed a couple basic lessons through Codecademy learning HTML and walking through how to make a website. I just need to keep building and learning.
I love tech stuff myself. Always like to have the latest and greatest and I built my own computer so I know how they work, I just need to learn how to communicate with them.
Do you recommend any physical books? I have this one ready to buy already.
This was an extremely fascinating read. I've felt this way for a while about social networks and it was part of the reason I finally got off Facebook after so many years.
One clear indication of this I saw frequently was the fact that no one called someone on their birthday any more (or even texted). I was seeing parents even wishing their children Happy Birthday or family members just liking another Happy Birthday post. This kind of impersonal interaction always bugged me.
This article has some great points in it and I hope there is a lot further research put into it. There are a few books cited, and a few others I found related. I've ordered ALL of them and plan to read them all as this is a really fascinating subject for me (a person who was born at the beginning of this era and has become an adult in it with two children who are going to grow up and have to adapt to this).
Books referenced:
You Are Not a Gadget - a Manifesto
Alone Together: Why We Expect More From Technology and Less From Eachother
And one related:
The Shallows: What the Internet is Doing to Our Brains
I will suggest start with Head first design pattern. That will gradually build your intuition about good software design. And it’s more fun to read compared to GoF imo. On top of that, there are Youtube videos by a guy named Christopher Okhravi on design patterns. Since I understand much better with videos (along with text book) because of my attention deficiency, they really helped me.
Apart from that, follow tech blogs of Netflix, Google, AWS, Uber etc. They are treasure troves.
Also, as /u/ibsulon mentined, Clean Code for writing good quality code, Programming Pearls and Pragmatic Programmer etc. Effective java and Doug Lea's book on concurrent programming - really helpful.
these books are great if you dont know much html and css
http://www.amazon.com/Web-Design-HTML-JavaScript-jQuery/dp/1118907442/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1456957990&amp;sr=1-1&amp;keywords=jon+duckett+html+and+css
and do a great job explaining the relationship between css and html in my opinion
id also super recommend if you're a beginner using bootstrap, you can read more about it here http://getbootstrap.com/ (its not integrated with dreamweaver too!) and there are plenty of youtube videos on it for creating simple but really great sites, its fully customizable and based off a grid structure which if you're a print designer you will love i think.
I can't tell exactly what you want to improve upon. If you just want better intersection algorithms/code, look at:
http://www.amazon.com/Introduction-tracing-Kaufmann-Computer-Graphics/dp/0122861604
http://www.amazon.com/Real-Time-Rendering-Third-Tomas-Akenine-Moller/dp/1568814240
The real performance gains in ray tracing, though, are parallelization and reducing the number of intersections tests that need to be done at all.
Parallelization is trivial.
For reducing intersection tests, you're best bet is some kind of space partitioning algorithm, like an octtree, k-d tree, or grid. It's not very hard either. The main idea is to pre-process the input into a grid-like data structure and do intersection testing by "walking" along the ray, through the cells. In each cell, do an intersection test with each object in that cell. Find the closest hit, and bail out. Traversing the grid is super easy and a lot faster than intersection testing. And (ideally) grid cells have very few objects, so the number of intersection tests is cut down a bunch, too.
The original paper for that technique, if you can find it, is this: http://portal.acm.org/citation.cfm?id=95111
> I want to return response in real time to javascript
I'm about to get really thorough with my response so, "hold on to your butts"
&nbsp;
As /u/Mike312 hinted at, this is not how PHP and vanilla Javascript works, and as such you would have to seek alternative frameworks or languages(like Websockets, NodeJS) or you can keep reading for an alternate solution.
&nbsp;
What you must understand is that PHP is code that lives on and is rendered on the back-end (server). That means that by the time the front-end (browser) has access to the page, the PHP code on the server has already executed.
&nbsp;
Now that you better understand relationship between PHP & Javascript means you have two options, a simple one and a more complex one:
&nbsp;
Simple Option: Abandon real-time
&nbsp;
Since you seem to be a beginner when it comes to PHP, this is the option I recommend as it is the simplest and fastest. In this case, you would have something on the front-end, like a button, that would call a new page. This page will render the results of the function I provided you.
&nbsp;
To break it down:
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
Complex Option: Explore AJAX
&nbsp;
AJAX or Asynchronous JavaScript and XML allows your browser(front-end) to make calls to your server (back-end) without reloading the page. This means that, as an example, you can create a button on the front-end that executes a javascript function. The javascript function would then make an AJAX call to your server, and you could return that server data WITHOUT having to reload your page. Please see the link I provided above for a very good example.
I won't write up full on code for you that shows you how the HTML/JS/AJAX/PHP all interact but, here is an outline of how I would do it:
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
&nbsp;
I know this is a lot of info to take in, but it should help implement a simple solution, then as your knowledge grows you can implement the complex solution.
&nbsp;
As a side note, if you are really looking into learning front-end/back-end development, I recommend the following books:
Web Design with HTML, CSS, JavaScript and jQuery Set
PHP & MySQL Development
Merry x-mas :)
Here's a list I compiled, the list books kind of hit a wide range. I don't really have any given list of talks I like. I'll just randomly google for videos by a speaker i like or subject I'm interested in.
Books:
Watch:
Podcasts:
Blogs:
News Letter:
Misc:
I guess I'm going to go ahead and be "that guy".
Don't aim to work with a specific language.
I feel you should reframe your goal to be a "problem solver" that knows how to pick and use various tools to solve a problem. C++ may be one of those tools. Maybe C. Maybe Python. Maybe Java. You want to develop your skill set to be flexible enough to adopt the right tool for a job. Now, that's not to say you can't be a language expert. Language experts are very valuable and becoming one is a perfectly reasonable goal. That said, I think you'll find that you have many more opportunities when you remain flexible.
With that out of the way, I would say good next steps for continued C++ mastery are to read and understand Scott Meyers' excellent books:
Also go through the CppCoreGuidelines.
Beyond the language, make sure you know your standard data structures and algorithms.
If you're willing to plunk down a bit of cash (or get a relative to help out), I'd recommend getting a game design book or two. I'd recommend The Art of Game Design by Jesse Schell and Game Design Workshop by Tracy Fullerton. Either one would serve as a good guide and overview of what a game designer does, what skills a good designer will need, and also, indirectly, what a designer is not.
There are a lot of different roles within game development, and although a moderate understanding of design principles and skills can be useful for many of those roles, most are still quite different from actually being some form of explicit game designer. Learning more about what a designer needs to think about and do might help you determine if that's the area where you actually wish to focus, or if perhaps you'd rather look into other roles such as software engineering, art, audio, quality assurance (which isn't actually very comparable to just playing and being good at games), project management, and more; and each of those have sub-disciplines (examples: gameplay scripting versus graphics engine development; 2D, 3D, concept, and technical artists; composer versus sound effects).
But at least I'd say that, if you don't know where to start, game design is a good place. This is because a game designer needs to be involved with essentially all other roles in game development, and so learning about the game design process can be a great way to catch glimpses of all the other roles, and see how those other roles relate back to the overall process of game development. From there, you can choose whether to stick with the design (and maybe pick an area of design to focus on, like mechanics, level design, story/character design, aesthetic design), or instead shift your focus onto one of the other areas.
If you do stick with design itself, I'd recommend for an educational path to not look for anything too focused or specific. Game design skill, in my humble opinion, comes largely from a lot of practice and from a broad knowledge or at least awareness of many subjects. Some subjects are likely to be better than others as the center of your education, but don't let the center dominate too strongly.