Console #92 -- Deskreen, HVM, and NGS
An Interview with Ilya of NGS
Deskreen turns any device into a secondary screen for your computer. Deskreen is an electron.js based application that uses WebRTC to make a live stream of your desktop to a web browser on any device.
language: TypeScript, stars: 12296, watchers: 238, forks: 621, issues: 55
last commit: January 08, 2022, first commit: August 08, 2020
High-order Virtual Machine (HVM) is a massively parallel, optimal functional runtime in Rust. HVM is a pure functional compile target that is lazy, non-garbage-collected, and massively parallel.
language: Rust, stars: 3748, watchers: 52, forks: 95, issues: 18
last commit: February 13, 2022, first commit: January 03, 2022
Next Generation Shell is a powerful programming language and a shell designed specifically for Ops.
language: C, stars: 1017, watchers: 31, forks: 35, issues: 266
last commit: February 13, 2022, first commit: June 29, 2013
Not subscribed to Console? Subscribe now to get a list of new open-source projects curated by an Amazon engineer in your email every week.
Already subscribed? Why not spread the word by sharing Console with the best engineer you know?
Hey Ilya! Thanks for joining us! Let’s start with your background. Where have you worked in the past, where are you from, how did you learn to program, and what languages or frameworks do you like?
I am originally from Moscow, Russia.
I have liked programming since I was a kid. I remember writing BASIC programs on a paper around 1st grade.
I assume the fact that my father is a programmer has played some role in this. He showed me punched cards, punched tapes, big magnetic tape discs. He took me to his work a few times. I even played games there. At home, we did not have a computer.
After moving to Israel, I remember going to computer stores and using computers there before we had one at home. I am grateful that the store owners allowed that. I was learning Pascal at the time.
I continued learning programming and Linux mostly by myself from documentation and books so I knew how to program by the time I got my first job. It was PHP programming and Linux administration. It was quite a positive experience to say “I don’t know PHP but I know how to program” and get “OK, start”.
Following that, there was another interesting job: Linux systems administration. Many clients, many different systems, hardcore bash scripting. We learned quite a lot and that’s not only because of the variety of tasks. I met Guy there. He showed my friend, Andrey, and I how to work: thinking, planning, processes, etc. Well, at least he tried :)
My current employer, Beame, convinced me to stay after being my client first. The variety of projects here is also well above average. I had a chance to get into Java and Netty for example.
What’s your most controversial programming opinion?
Yes, Unix pipes are great… but have you seen what’s going on in other programming languages? Admittedly, shell pipes do feel ergonomic but conceptually unidirectional untyped byte streams are not that impressive these days.
What is your favorite software tool?
TL;DR - Vim for text editing and JetBrains IDEs for programming.
I feel that IDEs from JetBrains make me productive. This is mostly related to how they “understand” the programming languages. I used Vim for years. I contributed a bit of code to Vim. I still use it and consider myself a power user. It’s an excellent text editor but it is not an IDE. You could stretch Vim to be an IDE or you can have one from JetBrains that was designed to be one. There is a difference.
If you could dictate that everyone in the world should read one book, what would it be?
Thinking Fast and Slow. I think it is important for people to understand how the mind works. This is an excellent book precisely about that.
If you had to suggest 1 person developers should follow, who would it be?
I’ve seen a few videos by Bjarne Stroustrup (inventor of C++) and he seems like a very intelligent, reasonable and practical person.
If you could teach every 12 year old in the world one thing, what would it be and why?
Do more meta-thinking. Understand yourself, why you are doing this or that, how and why you feel in a particular way, why you want whatever you want, why you are saying what you are saying.
If I gave you $100 million to invest in one thing right now, where would you put it?
In a technology that would end this stupid correlation between mobile device size and the viewable area.
What have you been listening to lately?
Any lessons you’ve learned as a manager?
As a manager, I learned that doing the basics like being clear on “who does what by when” and weekly one-on-ones can go a long way, conversely I observed that absence of these basics is a disaster.
Why was NGS started?
Frustration. I was using bash and Python at work to automate whatever needed automation. A big chunk was AWS infrastructure setup and deployments.
More at https://ilya-sher.org/2017/07/07/why-next-generation-shell/
Where did the name for NGS come from?
The name Next Generation Shell comes from a desperate want of something better. It also reflects the flow of time, which is mostly frozen for bash and many other shells. It feels unfair that developers get new shiny languages and tools but DevOps are “stuck” with bash or general-purpose programming languages.
Who, or what was the biggest inspiration for NGS?
The glaring hole in the modern programming languages for the DevOps niche. You want modern? That is Python, Ruby, Go, etc. You want a language for DevOps? That is bash.
The “problem” with general-purpose languages is that they don’t have ergonomic facilities for DevOps. Want to run an external process? That would be verbose. Want to care about the exit code of the external process? Even more verbose. Want to work with files? Also not very concise.
The “problem” with bash: extremely poor error handling, missing data structures, syntax. All of that was the norm (or at least acceptable I guess) a few decades ago. Today, you would be laughed out of the room for proposing these things. A related observation is that other languages also had afterthoughts such as “use strict” which very roughly corresponds to set -eu in bash.
Other projects are trying to fill this niche. There is no single project that causes me to think “Oh yeah, that’s exactly how I envision the solution, I should stop working on NGS”. So I continue.
More at: https://ilya-sher.org/2020/10/31/bash-or-python-the-square-pegs-and-a-round-hole-situation/
Are there any overarching goals of NGS that drive design or implementation?
I somehow assumed that if it’s not a toy language it must have those. I’ll list some here:
Small scripts don’t pay. You don’t need to pay for something that is possible in the language when you don’t use it. Example: main() function. It provides a very ergonomic way to parse the command line arguments. You declare the main() parameters and NGS parses the command line arguments and passes them to main() for you. When you don’t care about arguments - just don’t define main(), the script runs top to bottom. Small scripts stay small.
Syntax compression. The more frequently used a feature is, the shorter the syntax will be.
Small number of concepts. For example, NGS does not have classes. There are types and methods. I’m pretty sure NGS can live without the concept of a class. The inspiration came from Common Lisp Object System except that NGS implementation is significantly simpler, for better and worse.
More at https://ngs-lang.org/doc/latest/man/ngslang.1.html , under “Language principles”
What trade-offs have been made in NGS as a consequence of these goals?
Being coherent is valued over “making people from other languages feel at home”. Other languages have Maybe/Nothing/Just and Option/Some/None while NGS has Box/EmptyBox/FullBox. A function will not have an alias, that will keep the code base consistent.
Being productive over the long run comes over ease of onboarding.
Are there any competitors or projects similar to NGS? If so, what were they lacking that made you consider building something new?
There are alternative shells. None of them are proposing a “radically” new interface. Why quotes? Because these are the things which have been out there for decades. Somehow even the newer shells ignore these developments in UI and UX. See the UI design wiki page - https://github.com/ngs-lang/ngs/wiki/UI-Design
None of them are proposing to make the UI in the language itself. I don’t understand why any user of the shell needs to learn Go, Rust, C or whatever that is all of a sudden just to contribute to the UI part. I think the UI should be the same language.
None of them have the programming language that I feel aligned with. I think this is the most subjective point but hey, if you think like me, you might like NGS.
What was the most surprising thing you learned while working on NGS?
Garbage collection. Fortunately, there is a library for that in C. Therefore I did not have to implement it by myself in NGS, I’m just using that library. I peeked into that library out of curiosity and understood the surprisingly huge amount of work that went in. Take a look - https://www.hboehm.info/gc/
What is your typical approach to debugging issues filed in the NGS repo?
There is no typical but the common step would be reproducing the issue first. If it’s something about internal workings, DEBUG=* environment variable setting can help quite a bit.
What is the release process like for NGS?
Nothing extraordinary here. It’s all documented at https://github.com/ngs-lang/ngs/blob/master/release.md, to be scripted soon now. In NGS of course.
Is NGS intended to eventually be monetized if it isn’t monetized already? If so, how?
Maybe. Professional services would be the top bet.
Do you think any of your projects do more harm than good?
Not yet, I guess :)
What is the best way for a new developer to contribute to ngs?
Use it. See how it goes from there. Open issues for anything that goes wrong on the way. Contributions are appreciated in these areas: marketing (I am not good at this at all), code in NGS, code in C, language design, UI design.
If you plan to continue developing NGS, where do you see the project heading next?
I am currently improving the language IO facilities to unblock the UI development.
What motivates you to continue contributing to NGS?
Personal needs. All these times that I look at bash, Python or other scripts and it’s a “that would be much simpler/shorter/straightforward in NGS” moment. I am also fond of the idea that other people with similar problems can become more effective in solving them in case they decide to use NGS. I like the idea of helping other people. Software is a pretty scalable way to do that.
Do you have any other project ideas that you haven’t started?
I started just a little bit but the project is now on hold. It’s a book about naming in programming. Naming issue is mentioned among other “information loss” issues at https://ilya-sher.org/2019/05/18/on-information-loss-in-software/, or if you prefer video: https://www.youtube.com/watch?v=sxXCBomdAak
Where do you see software development heading next?
I can talk about what I think we need. Improve software quality. The average quality of code that I see is pretty bad.
AWS for example. Few months ago, they converted one repository from public to private after I filed around 12 code quality issues. Pretty bad ones. I assume there was no code review. By the time of writing this, the repository is still not public and “This solution implementation is no longer available”. This is somehow surprising because I had a video session with the author at the time and he was very receptive and was actively fixing the code.
How about we stop hard coding credentials in the code? I’m looking especially at you, documenters. Is that really what you like to show to potentially novice developers that don’t know better? Hard coded credentials because “it’s just a simple example”?
Do you have any suggestions for someone trying to make their first contribution to an open-source project?
See other contributions and how things work. If not sure, discuss your proposed contribution with the authors first.
What is one question you would like to ask another open-source developer that I didn’t ask you?
It’s more of a broadcast question. All the developers of the classical shells: what would you do differently if tasked today with creating a shell?
Interested in sponsoring the newsletter or know of any cool projects or interesting developers you want us to interview? Reach out at email@example.com!