Show HN: I'm 12, learning JS, and wrote Wolfram's cellular automaton in Node
bitbucket.org
bitbucket.org
I thought it might be useful for you to incrementally see how someone in industry would review or change this code, so here's a little code review via video: https://youtu.be/UkVOrcS--04
We very incrementally build up to the final code, which can be found here: https://gist.github.com/stevekrenzel/b490564bf1c7f98e232a6c8...
Hope you find it helpful!
Thanks a lot!
Come out of the woodwork, let him know! If I can, you can.
The video format is a nice twist, in my distributed teams sometimes we've done "code review meetings" for some changes that are rather involved to capture some of the benefits of in-person / video code reviews.
I watched your video and although I don't understand everything, I learned a lot. Separating my program into functions is a good idea. Your video clarified the map function for me.
Through your video, I understood that I was running code multiple times, when it only needs to run once (how I parsed my rules was one of these instances that you went over in your video), so thanks for pointing that out.
Again, thank you so much for taking the time to review my code. I really enjoyed your feedback.
Good luck, and feel free to reach out if you get stuck on anything.
Whatever you do, hold on to that. Never be mad about feedback just try your best to understand it, and if it's wrong explain yourself without getting frustrated, this is worth more than a dozen senior developers who explode at feedback (I would argue they're junior developers :) and you will have a wonderful career. Also look for good mentors, and don't be afraid to ask questions about direct feedback, if you didn't understand something he said just ask (this becomes an immediate learning opportunity and you will be better off for it), even if he doesn't get to answer, someone else might. This is a field where learning is endless, you will always learn something new as a software developer, new platforms are made all the time to be programmed on / with.
Having soft skills[0] will be the biggest asset you can have as a software developer, whether you do it for money or just for fun, if you have to collaborate in the open you will need to communicate with others. Nothing breaks a team like terrible communication and someone who rejects feedback out of pride.
Liam -- this response is just as impressive as the code that you wrote. You're obviously very smart, but that isn't good enough on its own. I've seen very-smart people who aren't open to critique, who get defensive rather than take the opportunity to learn new things. They don't get very far in life. On the other hand, the attitude you're showing here is tremendously valuable, and will serve you incredibly well throughout life. Never let yourself grow out of it!
Liam - whatever Steve suggested are very good pointers but please remember you are getting accolades here because you cared to publish your code. Don't hesitate to publish your initial version without any hesitation in future also.
(rule & (1 << i)) === 0 ? 0 : 1
You could just do: (rule >> i) & 1
Otherwise it was a good review! I'd probably also extract parts of this long line so it's not as cumbersome to read: return state.map((item, i) =>
rules[((state[i - 1] || 0) * 4) + (item * 2) + (state[i + 1] || 0)]
);
to return state.map((item, i) => {
const prevItem = state[i - 1] || 0;
const nextItem = state[i + 1] || 0;
return rules[(prevItem << 2) | (item << 1) | nextItem];
});
It also uses bitwise operations instead of arithmetic, even though they are equivalent in this context, simply because we are effectively operating on arrays of bits.For example, instead of:
var length = Math.sqrt((x * x) + (y * y));
You can go: var length = Math.sqrt((x * x) +
(y * y));
That way you can see the similarity of squaring x, and squaring y. But breaking up the multiplications because they repeat the x's and y's would be taking it too far -- it always requires balance and thinking about how can I communicate my intent and the SHAPE of the problem I'm solving.You can also use indentation and formatting to bring out and make obvious other two-dimensional patterns and regularities, especially with two-dimensional cellular automata and graphics code.
There are some examples of that technique in my 2D cellular automata machine code. (There's a lot of code, so don't be overwhelmed, since I've been working on that since around 1985 or so. So never give up and just stick to it! You don't need to understand the code, which is pretty esoteric, just notice the patterns.)
https://github.com/SimHacker/CAM6/blob/master/javascript/CAM...
// Load the right two columns of the 3x3 window.
n = cells[cellIndex - nextCol - nextRow]; ne = cells[cellIndex - nextRow];
c = cells[cellIndex - nextCol ]; e = cells[cellIndex ];
s = cells[cellIndex - nextCol + nextRow]; se = cells[cellIndex + nextRow];
[...] // Scroll the 3x3 window to the right, scrolling the middle and right
// columns to the left, then scooping up three new cells from the right
// leading edge.
nw = n; n = ne; ne = cells[cellIndex + nextCol - nextRow];
w = c; c = e; e = cells[cellIndex + nextCol ];
sw = s; s = se; se = cells[cellIndex + nextCol + nextRow];
[...] var sum8 =
(nw & 1) + (n & 1) + (ne & 1) +
(w & 1) + (e & 1) +
(sw & 1) + (s & 1) + (se & 1);
[...] var tableIndex =
(((c >> plane) & 0x03) << 0) |
(((e >> plane) & 0x03) << 2) |
(((w >> plane) & 0x03) << 4) |
(((s >> plane) & 0x03) << 6) |
(((n >> plane) & 0x03) << 8) |
(((cellX ) & 0x01) << 10) |
(((cellY ) & 0x01) << 11) |
(((phaseTime ) & 0x01) << 12) |
(((plane >> 1 ) & 0x03) << 13);
[...]When the sub-expressions won't fit on one line, you can still use indentation to help the reader understand the spatial patterns:
error +=
(nw * kernelBytes[4 - kernelDown - kernelRight]) +
(n * kernelBytes[4 - kernelDown]) +
(ne * kernelBytes[4 - kernelDown + kernelRight]) +
(w * kernelBytes[4 - kernelRight]) +
(c * kernelBytes[4]) +
(e * kernelBytes[4 + kernelRight]) +
(sw * kernelBytes[4 + kernelDown - kernelRight]) +
(s * kernelBytes[4 + kernelDown]) +
(se * kernelBytes[4 + kernelDown + kernelRight]) +
frob;
But that would probably be more readable if I used intermediate variables for the kernelBytes[...] expressions, gave them descriptive names matching their corresponding directions, and lined up all their calculations so you could see the similarities and differences, because right now all the kernleBytes[4 +/- kernelDown +/- kernelRight] expressions are jumbled around horizontally, when they could be lined up nicely by themselves if they weren't interleaved with the n/s/e/w/ne/nw/sw/se multiplications. (I'll leave that improvement as an exercise for the reader. ;)The point is you want to vertically line up as many of the repeated letters and symbols in nice neat columns as possible, so that your eye can easily see which are the same, and the ones that aren't stand out obviously so you can ignore all the same things and focus on the differences. (Which are typically variations like +/-, sin/cos, x/y/z, -1/0/1, nw/n/ne/w/c/e/sw/s/se, and longer series of names and numbers. Whatever changes should stick out visually, and be lined up and grouped together so your eyes can scan over them!)
That not only helps other people understand your code, but it also helps you be sure that you wrote the right thing, what you actually meant, instead of making an easy to miss typo.
The difficulty of reading you own code, which is HARD even for professional programmers, is that you usually see what you MEANT to write, not what you actually wrote. That's why it's so important to get other people to read your code, and to read other people's code, like pair programming and code reviews, or even explaining it to a duck.
https://en.wikipedia.org/wiki/Rubber_duck_debugging
It takes a lot more effort and concentration to slow down and look at what's actually there, instead of what you want to be there. (That's true for many aspects of life...)
Highlighting searches is enabled with `:set hlsearch`, and you can search for whatever word is under the cursor with ``. So I just type and it highlights all of the matching words. Nothing too magical!
I wish this inspires clever people to produce huge amounts of parody-videos "refactoring" the same piece of code. :)
I showed your project to my 12 year old son who has just started to learn programming (in JS no less!) and his jaw dropped.
In addition to being a programmer, you are now a role-model. Really well done.
Tell your son that it took me a while, and a lot of work, but it feels great to finish something (there are a lot of projects that I don't finish...).
I began learning using Scratch a long time ago. They even featured me last year (the project was a solar system in which I used sine and cosine to calculate the rotation of the planets). I then used blocklike.js to move to JS.
I watch a lot of YouTube videos. I like The Coding Train, Carykh, and Code Bullet, and I get a lot of my ideas from their projects.
You and me both. :)
You'll learn, build relationships and some of you will go off and found companies together.
Kind of like when I was trying blacksmithing, the teacher makes you make your tools first.
Maybe you were either too late, or too early, depending on perspective. :)
The mentality of those taking boot camps, and the mentality I had when I started coding are vastly different, but I can see the use.
Various example BASIC programs (e.g. Lissajous curve and circle plotters and such) used those functions and from their behavior I kind of picked up the relationship to both undulation and the circle. I found out about the arctangent function, and from that I realized that it could be used for 3D projection. I made a proof-of-concept program that mapped some connected points in 3D (boxes and whatnot) to 2D by calculating the visual angles using arctangents: i.e. I plotted the angle between the line of sight and each point, rather than a simple planar projection. It resulted in the objects appearing in a very nice "fish eye" perspective on the screen, which was very pleasing. From all that I learned about radians also and how there are "two pi" of them in a circle, since the functions accepted radians and not degrees.
You know how they say that necessity is the mother of invention; it's also the mother of learning trigonometric functions and whatever else.
By the time it came around, I was disappointed to learn about all the "triangle stuff". I want quite there enough to make the link between right angle triangles and a circle but it made that topic so much easier to connect.
Thanks to programming and the thought patterns it drums into you, I was able to do my maths course work in a few pages (far less than anyone else) but still achieve high marks. I remember one top performer in my class complained to my teacher because of how little I'd produced! The teacher said "doesn't matter - he used an approach that let him do that".
Having a lot of projects that you don't finish is completely normal, so don't worry about that.
It would be much better if he would start with Scratch, Processing, Smalltalk, or even Python.
On JS he'll have to lose time coping with complicated build tools, horrible package system, async etc.
- devtools are unmatched for browser development (and getting better for node)
- absolutely best language for prototyping (dyn. typing, monkey-patching, eval, and a lot of other "evil" things you usually don't need in further phases but it's really great to have them for this exploratory phase)
- I respect that some people prefer static typing and code-completion but I prefer writing tests and having few well-known libraries for which I don't need completion at all
- no threads, no mutexes, no locks
- object literal, rest-spread, destructuring, classes are just ordinary (and mutable) objects, etc...
If you think people are doing JS just because it's the only language in the browser (not true anymore) you should seriously reconsider. There were to-js compilers before and it was always awful (remember gwt? dart?)
Of course, it depends on use-case, JS is not the best language for everything.
Back in the day we started with Qbasic not because it is a good language but because that was easy to set up, we all had it and our friends had it and our school computers had it.
And JS is less bad a language than Qbasic.
Set up is rarely an issue, once you set up a language even as complex as C++ its completely automated. You press a button and magic happens.
If the biggest selling point of a programming language is that it comes preinstalled with the OS of your choice, its not much of a selling point when the average user downloads and installs GBs of data just to play the latest game hype like Fortnite.
The only people who mind installing stuff are predominately web devs. 99.9% of users out there are fine with it for more than 6 decades now and that wont be changing any time soon.
But you can hack away on any computer with a browser.
Ideone is a popular example https://ideone.com/
see how that sounds? that's how you js haters sounds each time I see this bs here on this and many other platforms that wouldn't be possible without js.
A language that requires a 21x21 matrix to remember how equivalency works is objectively bad: https://dorey.github.io/JavaScript-Equality-Table/unified/
A language whose default sort behavior is the following is objectively bad:
[5, 12, 9, 2, 18, 1, 25].sort(); → [1, 12, 18, 2, 25, 5, 9]
I used to be a frontend dev. I have written hundreds of thousands of lines of production JS code for apps that many Hacker News users use on a regular basis. I well understand how much JS has made possible. The web would not be the same without it. But that doesn't mean it's a good programming language.JS is the New York of languages: dirty and gross and hella expensive, but if you can make it there, you can make it anywhere.
A simple `node index.js` can go really far.
Good job Liam
Everything else is unnecessary, at least as far as the programming language itself is concerned.
It’s still perfectly possible to just create a html document, shove in a script tag, and start developing
And if you want to use packages from the npm ecosystem you can easily use https://unpkg.com/
https://beta.observablehq.com/@jrus/wolfram-cellular-automat...
Google String.prototype.padEnd. It’s built in to JS and should be able to replace your zero fill function.
And instead of mutating the ruleSet array you should be able to use Array.prototype.map like this:
const ruleSet = zeroFill(8, rules.toString(2)) .split('') .reverse() .map(item => parseInt(item, 10));
And you can clone arrays like this, instead of using loops:
const oldArr = [...arr];
Also arrays are still mutable even if you assign them to const variables.
I’d offer more help but I’m on mobile. Sorry for the poor formatting. Hope this helps anyway. Good luck!
If you do web stuff (and you don't want to just say "no IE 11" - some people, and even some big companies, do that!), usually the easiest way to handle stuff like that is to use the newest syntax you're comfortable with, plus a tool like Babel that will produce a "time travel" version with older syntax that will work in all browsers.
While that's true, future projects are a lot easier if one doesn't have to keep re-referencing "what works in Node" vs "what works on the web".
Interestingly, some people (typically newbies who are looking for rewards without commensurate effort. but others too) do not think that way, and even sometimes don't like it if such suggestions are made. I once made such a suggestion to a poster (an obvious newb) on comp.lang.python. He asked how to do some small task in Python. I suggested that he may learn more if he tried it on his own first. He misunderstood the intention behind the advice, and made some comment to the effect that my idea was not helpful, or something like that. Another regular pitched in and pointed out that my comment was meant in the spirit of helping him learn better, because a) if you try it yourself first and do get a solution, you just got better at something, and it will boost your confidence, and b) even if you do not get a solution, you will learn that the thing is not as easy or trivial as you thought (or why were you asking in the first place, except if wanting others to do your work for you) (which would happen if you just blindly used some library to do it). And will gain a new respect for the depth of your profession and all that it entails.
Related: How To Ask Questions The Smart Way:
http://www.catb.org/esr/faqs/smart-questions.html
It's by Eric Raymond, author of The Cathedral and the Bazaar and The Art of Unix Programming.
There are many interesting points in that article, e.g.:
http://www.catb.org/esr/faqs/smart-questions.html#noprivate
Seen people ask for private replies. IMO some of them do it because either a) they don't want to be seen as not knowing the thing if it was obvious, or b) not wanting others (likely their peers) to get the answer too. Both not good.
I'll admit to occasionally being frustrated by comments like this. It's important to remember that not everyone is looking to learn. Sometimes, they just need to get something done ASAP.
It's a bit idealistic to assume that everyone has time to learn the canned solution. The real world doesn't always allow for that.
>I sometimes try to implement
It's each person's call, on a case-by-case basis. Had just shared my view with that newb, thinking it might help him.
Humans are the worst
You have the ability to write some code! If you want to get a jumpstart, you should take the princeton algorithms course (for free!): https://www.coursera.org/learn/algorithms-part1
Or read the textbook by sedgewick that accompanies the course. https://algs4.cs.princeton.edu/home/
There is very little math in there - it may take some elbow grease and mentorship to help to convey some of the ideas - but I believe that you could implement and solve most everything in there. That was my path - I had a teacher at the age of 14 who would explain to me how different algorithms worked and I would go and implement them. Drawing a circle (in memory - it was in C!) or sorting a list (we did bubblesort first IIRC!)
I think you could do it! I believe in you! The course material is approachable - much more so than basically every other algorithms/data-structures material I've found. it may take you some time but you'll be soooo far ahead with your thinking about code.
If you ever start working with Object oriented languages like Java, another book that may help you when you've gone down the road a bit is the Head First Design Patterns book. http://shop.oreilly.com/product/9780596007126.do It's very easy to read, mostly pictures. It is made to be very easy to read (all of the books in that series are so look around at them.)
It's helpful to do both - code and also take in some material, but at 12 I imagine some of the material may be a bit daunting. You're doing really well - keep it up.
I am not saying you don't do this, but please please ensure you always sleep well, follow a good diet and go out and play.
Sometimes, computers make us give up good habits!
Kudos for your great work and keep learning, keep shipping!
By the way, I'm a 17 year-old developer (https://shamdasani.org), but I probably started ~14. My main project is Enlight (https://enlight.nyc) to teach others to code by building projects. If you'd like to contribute, that would be awesome - feel free to shoot me an email :)
Liam, this is super cool. I also got started young and wish I had the skills to frontpage at 12 :-). Keep it up!
Would love to have you say hi in the Hack Club Slack. I'm @zrl.
I used blocklike.js to jump from Scratch to JavaScript. Then I worked for months on this one game for the app store called Sticky Quest. You can find it here: https://itunes.apple.com/us/app/sticky-quest/id1425679649?mt... This how I learned how to use npm packages such as Cordova and Eslint.
One option is a 'totalistic' CA which looks at the average value of a given neighborhood, and can have more than two states.
http://mathworld.wolfram.com/TotalisticCellularAutomaton.htm...
Or you could generate CAs with different starting conditions. Some beautiful elementary CAs don't 'show up' with just one initial point.
It's a "Robust First" asynchronous distributed fault tolerant cellular-automata-like computer architecture.
Robust programs running on massively parallel unreliable hardware can actually tolerate hardware failure and repair themselves. The Demon Hoard Sort algorithm is an inherently robust sorting algorithm for the Moveable Feast Machine.
http://movablefeastmachine.org/
The "Distributed City Generation" video demonstrates a Movable Feast Machine rule that builds a self-healing city that fills all available space with urban sprawl, with cars that drive between buildings, and city streets that adaptively learn how to route the cars to their nearest destinations, and the city even repairs itself after disasters!
https://www.youtube.com/watch?v=XkSXERxucPc
Here's some more info:
There's another visual programming language called "Snap!", which is inspired by and similar to Scratch, but has the full power of JavaScript and Scheme, everything's an object, and you can define your own blocks. Plus there are some amazing networking, speech and AI blocks, too! (It has a JavaScript block that makes it very easy to extend and plug in existing JavaScript code.)
I'm interested to know what you think of Snap!, from your perspective of going from Scratch to JavaScript!
AI extensions of Snap! for the eCraft2Learn project:
https://ecraft2learn.github.io/ai/
>The eCraft2Learn project is developing a set of extensions to the Snap! programming language to enable children (and non-expert programmers) to build AI programs. You can use all the AI blocks after importing this file into Snap! or Snap4Arduino. Or you can see examples of using these blocks inside this Snap! project.
Here's more info:
Cheater! :) Seriously though, great work. I started around your age (which I guess means I've been coding for half my life at this point.) Keep challenging yourself with new and interesting projects and you're going to learn a lot and have a lot of fun.
Do you have any plans for future projects? Maybe a simple place where you could chart your progress?
I think one of my favorite uses of cellular automata besides conway's game of life (if you are interested in it) is modeling simple fluid mechanics (water flowing from place to place) in games like dwarf fortress http://www.bay12games.com/dwarves/
Anyone else miss learning this quickly?
In all seriousness, congrats. Keep at it. There is always something else to learn. It's the career that never stops giving.
Just a tip, you don't need to include `npm init` in your instructions. That command only needs to run when you create a new project. It worked just fine for me with just a `node index.js 18`
Great work!
Seeing how things come to life that you've build with your own hands is a very empowering experience. Keep it up! :)
I think the furthest I was getting at that time was building out really terrible looking web pages in Notepad and making awful little animations in BASIC and Turing (learning lang).
Keep it up!
or something more (e.g. playing different frequencies to sound like the happy birthday song)?
Related, and good fun for kids of all ages (first did something like this on my earliest home computer [1]):
Play the piano on your computer with Python:
https://jugad2.blogspot.com/2013/04/play-piano-on-your-compu...
[1] Lissajous hippo, retrocomputing and the IBM PC Jr.:
https://jugad2.blogspot.com/2012/09/lissajous-hippo.html
Western classic music fans may find the comments on that post interesting - stuff about octaves and frequencies.
Us old people tend to forget things.
1. Keep practicing. Practice makes perfect. Explore different languages, frameworks, and problem spaces (interfaces, servers, distributed systems, statistics, etc.) to see what you find most interesting. You will make mistakes, and that is okay. That is how you learn.
2. Take frequent breaks. Programming is hard work. It can be truly exhausting, and you should not be afraid to step away and go for a walk or something.
3. The most valuable people in the industry are called "T"s. I.e. people with a little bit of knowledge/experience across broad range of topics (the horizontal part of the letter T), but who have deep knowledge/experience in one or a couple particular topics (the vertical shaft of the letter T).
4. Begin to develop the skill of taking feedback and accepting criticism. There's a lot of people out there who will be quick to criticize everything you do if you put it out into the open. It's a whole skill in itself to be able to interpret this feedback and separate the signal from the noise. Try to empathize with the person or group providing feedback and understand that their motives/perspective may be different from yours. Sometimes that's a useful thing. Sometimes it's a distraction.
5. Dn't take things too personally. You are not your code. A criticism of your code is not a criticism of your character. The less you take things personally, the easier it is to work with others. After all, the most impressive systems require immense collaboration.
6. Don't take yourself too seriously. Have some fun with it! Programming is super fun, so you should ask yourself regularly "am I still having fun?". If the answer is "No", maybe find something else interesting to focus on for a bit.
7. Broaden your perspective. Along the lines of #1 and #2, it's important to maintain a broad perspective and push yourself to keep expanding your perspective. This doesn't just apply to technical problem areas or languages or frameworks. The best engineers are good problem solvers because they have a broad perspective not just of the problem space but also more generally of the world they inhabit. Try to learn about different industries, cultures, people, and places. You will become a more well-rounded character for doing so, with a higher ability to empathize with others and understand the complex mechanics of how the world works.
8. Be social. I made the mistake of hiding in my room on a computer for much of my childhood, and it wasn't until high school that I really began to understand the value of social interaction and maintaining strong solid friendships. It's as important to spend time away from the computer as it is too keep practicing.
All the best. Good luck!!
There's a lot of ways to learn anything, but I would say that the first step is pursuing a variety of subjects that you find interesting, and even some you think are boring. A lot of seemingly boring things I've found turn out to be quite fascinating when it comes down to it. (e.g. database design)
Over time, you will pick things up, and put them back down. You will return to some, and stay away from others, but eventually you will build a repertoire of knowledge and experience in a variety of different fields. I would also bet that at least one subject will interest you so much that you keep coming back and in which you will ultimately develop expertise.
Experimentation is the name of the game!
I see just dabbling in whatever interests and experimenting with them takes one forward.
What you wrote is profoundly impactful.
Among the things that aren't common knowledge among basement programmers: network configuration (VPCs, load balancing, CDNs, security), security/IAM, non-relational datastores, ML model development & training, and the list goes on and on and on (microservices & containers, devops, serverless, advanced logging/monitoring & problem solving, high availability, HPC/grid, blockchain, and oh so much more.
The point I'm trying to make is that you can become a T shaped programmer by continuing to study and learn various programming skills, but you may want to alternatively consider becoming broad in ways that expand your value beyond just coding.
Trivial example: at some point around age 17 I installed Gentoo successfully and learned a lot about gnu/linux (and some bsd) in the process. Lots of little skills formed and connected, and they continue connecting with other things to this day. Got my initial hook on vim then. Saw how nicely colorized my terminal prompt was and that opened the door to many bash customizations. One of the skills I had to learn was to understand how hard drives worked (at least to the ability to successfully partition, format, and boot them -- I did accidentally wipe a windows xp partition the first time). Some years later (age 20?) I had accidentally rm'd a couple weeks of java work without having committed it yet. But prior knowledge of the system let me know the data was still there, and I was able to recover it by scanning the disk device partition directly for the bytes. (Ended up using "grope.tcl" referenced here http://wiki.yak.net/592 which was a lot more efficient than what I was making.)
I once tried upgrading my Windows laptop while having very less space in C drive. Windows totally crashed. After that I used live bootable Ubuntu, but would still like to retrieve all of my windows data.
Do you know how can I do that?
As a scientist, if one is a scientist and has abided these ideas, they'd ramp up the food-chain pretty quickly.
...that being said, this is way cleaner than any code I'd written at 12 I'm pretty sure.
That was me, too. It was a trade-off for me. I was reading Hawking in primary school and there was no one to talk to, so I was feeling lonely.
Programming was my lifesaving straw, but I don't wish any kid the kind of isolation that I've felt in my youth. I had to learn many of the social stuff later in life so it evens out IMO.
Take it as a compliment if it's legitimate.
I was a precoscious kid myself, and took to online communities with vigor specifically because it permitted me to interact with adults as equals without them constantly dismissing me without basis apart from my age. I've not forgotten that, and if anything society now is even more egregiously bigoted towards the young than ever. Next time you read an article about "kids" or "teenagers" or "adolescents", try mentally substituting in "women" or "African Americans" for the group identity they're talking about. You might be surprised how identical the claims made, and the weak support given for them, are.
People lie about their gifted child to get them exposure all the time. People doing that with art comes to mind. Or even just a parent doing assignments for their kid.
You're not being creative enough if you can't imagine a world in which someone would lie about something on the internet for attention.
Set up your own site and blog about your journey and the lessons you've picked up along the way. Learning is about working and reflection. Blogging is a good platform for that. The very act of writing the content itself is reinforcing your knowledge. Dive into the work, research, reflect, stay hungry and repeat. That's what it's all about. Apart from that, you'll be expanding your network as well. Having some amount of folks following your journey is not just a good way of inspiring oneself, but also gives you an opportunity to inspire others as well.
Anyways, keep it up! You're definitely going places.
From the HN "legal" page:
> If you are under 13 years of age, you are not authorized to register to use the Site.
https://www.ycombinator.com/legal/
I assume no 12 year olds actually try to follow this boilerplate on the internet. Do sites that require a DOB to sign up reject those under 12?
But... HN doesn't actually collect any personal info. So, that's likely either a reflex inclusion of such a clause or just an abundance of caution.
I would also recommend checking out The Coding Train. NYU ITP Daniel Shiffman's lectures on creative coding. It's time to get started with graphics ;)
https://www.youtube.com/channel/UCvjgXvBlbQiydffZU7m1_aw
And to get a headstart in Artificial Intelligence, from the same author comes the ml5.js library: friendly machine learning for the web. Best of luck!
In Javascript and other languages 'map' has become a kind of "functional operation" so we cant call things 'map' anymore (in public). We have to say 'space' or 'state' or 'grid' or something... but I do still think 'map' was good.
Congratulations on a very efficient and readable project. Bravo !
In functional programming I understand map as just a clone and convert operation. I noticed C++ has a 'map' data structure which is most suitable for associating references. A C++ map is not suitable for storing positions in space.
If you pursue a career in programming, you'll look back at your early work and have a great personal self-documentation tool to remind you of how far you've come.
"At the age of 12, he wrote a dictionary on physics. By 13 or 14, he had written three books on particle physics. They have not been published." https://en.wikipedia.org/wiki/Stephen_Wolfram#Early_life
https://www.hnf.de/en/permanent-exhibition/exhibition-areas/...
https://en.wikipedia.org/wiki/Von_Neumann_cellular_automaton
https://en.wikipedia.org/wiki/Von_Neumann_universal_construc...
It doesn't even matter what it is – pick one you like the sound of. French, German, Italian, whatever. When you bump in to someone later in life and you hear them speaking another language and you can interact with them, there's no greater satisfaction.
/off topic
Also, while it may seem great to learn early, I've worked with people who didn't write a line of code until they were in their 50s and they were far better at it after a few years than I am despite having 20 years more experience. Some people have a gift. Others have to really work at it. Sadly I'm in the second group. :)
Are you familiar with code golf? If not, I recommend it. In Code Golf, the objective is to complete a programming task in the shortest program possible, measured in bytes. While doing so, you really learn about the nuances of your language and its obscure features.
When I was about your age, I joined the code golf community at Stack Exchange, and since then my JS skills and general programming skills have improved greatly. I hope that you would find it to be useful too.
> dimensional cellular automata in witch all possible rules are encoded into one byte as described here
Small typo here - should be "which" instead of "witch"
It's a pleasure to see the impressive reception that your post is having. Also I want to join all the voices of congratulations you have received for your work at your age! Keep doing this kind of things, It is very inspiring for all!
Inside of animate() you are calling setTimeout() to automatically call animate repeatedly but this is also calling setTimeout() every time animate runs but setTimeout() should only be run once.
You should be able to take
setTimeout(() => {
animate();
}, 100);
and paste it over animate() on the last lineI'd say just find stuff that genuinely interests you and try to build it. I got my start focusing on games, but whatever gets you excited. You're already way ahead of the curve, so have fun with it, experiment, and you'll do great things :)
(not ideal on mobile)
But: if I open the bitbucket link on mobile, the left part of the text is clipped and it doesn't allow scrolling left.
With "request desktop site", it works perfect.
Why does mobile mode even exist if the desktop site works better??
The new Bitbucket interface really dropped the ball on this. It is almost unusable.
I hope they’ll fix it...
This is why HN is great.
I showed this to my girlfriend's sister whom has shown interest in programming, today I learned that she decided to drop her art classes in favour of some programming courses!
Well done!
You're doing phenomenal. You'll be role model for up-coming generation.
Great!!
Also, I and likely you come from a different generation (I'm aged late 30s) where my parents knew nothing about coding and I genuinely had to learn everything on my own reading books at a library when my parents would drop me off.
I only had access to a very expensive family computer where my parents would freak out if I changed something on the fancy appliance they poorly understood and essentially every language other than qbasic needed a pricey proprietary compiler costing hundreds of dollars.
These days with the accessibility of the internet, explosion of open source, craigslist laptops perfect for learning going for under $75 and the commonality of programming as a stable career, it wouldn't surprise me to find children living in say, the silicon valley with programmer parents who successfully get their child excited about programming early.
It's a different set of circumstances and a 12 year old able to write graphics demos doesn't sound that implausible.
> It doesn't feel adolescent but more grownup to me
Showing skepticism is also fine, our industry is not just nice code review and beautiful moments where people want to encourage you.
> If you are under 13 years of age, you are not authorized to register to use the Site.
But I applaud you for getting into programming this early.
Nice work dude!
For a next step, I would suggest giving a try at breaking it up into multiple files using import/export statements (it doesn't need it but it's good practice), and using a bundler like Parcel to build the finished file.
npm i --save-dev parcel-bundler
...then move your source JS files to a folder named src, and add to package.json... "scripts": {
"prepare": "parcel --target node src/index.js"
"start": " node dist/index.js"
}
In your individual files, you do like... // file-1.js
import somethingName, { whateverName } from './file-2'
// file-2.js
export function whateverName { ... }
const somethingName = '...';
export default somethingName;
...and then run... npm run prepare
npm run start
(The prepare script is also a "magic word" that will auto-run anytime someone does 'npm install', so usually an end user won't have to manually run it.)A bundler isn't strictly necessary if you plan to only run something in Node, but it lets you make a package that's usable in both Node and web projects, and it makes it simple to use Babel, which lets you Javascript features from the future that aren't actually in Node proper yet.
EDIT: story time. I once tried to make a 2D game engine in my late teens, but I wanted to be like the adults and have a proper class hierarchy. Suffice to say, I never finished it. Come to find a few years later, now class oriented OOP is passé and I was wrong to waste that time on it.
Learning to code and get things working is more cool (and in the end, more profitable) than making your code fit the norms of the day, which won't last anyway.
if (window) {
document.write(...)
} else {
console.log(..)
}
...and have it just work, without having to write everything twice.Additionally, this runs in Node, so you don't need to compile the source files with `parcel`.