Guido van Rossum joins Microsoft
twitter.com
twitter.com
Congrats to him for finding something fun to do in retirement - dictators usually end up with a different outcome. ;)
I'm looking forward to seeing the future of Python - I think this move will be great for the whole community, and lets him push boundaries without being bogged down on the management side.
The biggest hurdle to python right now is the stupid package managers. We need cargo for Python.
[0]: https://chriswarrick.com/blog/2018/07/17/pipenv-promises-a-l...
It is a package manager but it lacks features that many other package managers have in Ruby, Node, Elixir, and other languages.
For example there's no concept of a separate lock file with pip.
Sure you can pip freeze your dependencies out to a file but this includes dependencies of dependencies, not just your app's top level dependencies.
The frozen file is good to replicate versions across builds but it's really bad for human readability.
Ideally we should have a file made for humans to define their top level dependencies (with version pinning support) and a lock file that has every dependency with exact pinned versions.
The setup.py file contains a human readable designation of requirements and then `pip compile` generates a requirements.txt with all deps' (and deps of deps') versions specified.
Isn't that a good thing?
> no concept of a separate lock file with pip.
setup.py/.cfg vs requirements.txt, no?
if you make pip run 'pip freeze > requirements.txt.lock' after every 'pip install whatever', you almost solve that particular problem if setup.py is configured to parse that (it isn't by default and there's no easy way to do that!)
Yes, a very good thing.
> setup.py/.cfg vs requirements.txt, no?
A lot of web applications aren't proper packages in the sense that you pip install them.
They end up being applications you run inside of a Python interpreter that happen to have dependencies and you kick things off by running a web app server like gunicorn or uwsgi.
For a Python analogy vs what other languages do, you would end up having a requirements.txt file with your top level dependencies and when you run a pip install, it would auto-generate a separate requirements.lock file with all deps pinned to their exact versions. Then you'd commit both files to version control, but you would only ever modify your requirements.txt by hand. If a lock file is present that gets used during a pip install, otherwise it would use your requirements.txt file.
The above work flow is how Ruby, Elixir and Node's package managers operate out of the box. It seems to work pretty well in practice for ensuring your top level deps are readable and your builds are deterministic.
Currently there's no sane way to replicate that behavior using pip. That's partly why other Python package managers have come into existence over the years.
My method for deploying a web application is to have a Dockerfile which pip-installs the Python package, but I could see someone using a Makefile to pip-install from requirements.txt instead. In fact, I use `make` to run the commands in my Dockerfile.
I am running a pip install -r requirements.txt when I do install new dependencies. I happen to be using Docker too, but I don't think that matters much in the end.
In practice it doesn't tho.
Let's say I'm working on a project without a lock file and commit a change that updates my dependencies. I get distracted by anything and don't push the code for a few hours.
I come back and push the code. CI picks it up and runs a docker-compose build and pushes the image to a container registry, then my production server pulls that image.
With this work flow there's no guarantee that I'm going to get the same dependencies of dependencies in dev vs prod, even with using Docker. During those few hours before I pushed, a dep of a dep could have been updated so now CI is different than dev. Tests will hopefully ensure the app doesn't break because of that, but ultimately it boils down to not being able to depend on version guarantees with Docker alone.
There's also the issue of having multiple developers. Without a lock file, dev A and B could end up with having different local dependency versions when they build their own copy of the image.
I've seen these types of issues happen all the time with Flask development. For example Flask doesn't restrict Werkzeug versions, so you wake up one day and rebuild your image locally because you changed an unrelated dependency and suddenly your app breaks because you had Werkzeug 0.9.x but 1.x was released and you forgot to define and pin Werkzeug in your requirements.txt because you assumed Flask would have. The same can be said with SQLAlchemy because it's easy to forget to define and pin that because you brought in and pinned Flask-SQLAlchemy but Flask-SQLAlchemy doesn't restrict SQLAlchemy versions.
Long story short, a lock file is super important with or without Docker.
* Basically I would have a single bash script that every `.py` entrypoint links to.
* Beside that symlink is a `requirements.in` file that just lists the top-level dependencies I know about.
* There's a `requirements.txt` file generated via pip-tools that lists all the dependencies with explicit version numbers.
* The bash script then makes sure there's a virtual environment in that folder & the installed package list matches exactly the `requirements.txt` file (i.e. any extra packages are uninstalled, any missing/mismatched version packages are installed correctly).
This was great because during development if you want to add a new dependency or change the installed version (i.e. pip-compile -U to update the dependency set), it didn't matter what the build server had & could test any diff independently & inexpensively. When developers pulled a new revision, they didn't have to muck about with the virtualenv - they could just launch the script without thinking about python dependencies. Finally, unrelated pieces of code would have their own dependency chains so there wasn't even a global project-wide set of dependencies (e.g. if 1 tool depends on component A, the other tools don't need to).
I viewed the lack of `setup.py` as a good thing - deploying new versions of tools was a git push away rather than relying on chef or having users install new versions manually.
This was the smoothest setup I've ever used for running python from source without adopting something like Bazel/BUCK (which add a lot of complexity for ingesting new dependencies as you can't leverage pip & they don't support running the python scripts in-place).
It's really hard with many deps, it's why cabal (for instance) moved away from a global model.
Perhaps ruby was more "hackable" by bundler. (Bundler has now become part of ruby stdlib, but didn't start out that way, it definitely started hacking around the way the more fundamental stdlib 'rubygems' worked).
Bundler is not a "node_modules" style setup. It does not require dependencies to be in a local path (although they can be, the default is they live in a system-wide location, and this does not limit functionality). It also does not support more than one version of a dependency in the same execution environment (as node_modules does) -- that really would be impossible in ruby too.
It's possible something about python's design would make the bundler approach impossible, I don't know. But it's not "dependencies are installed globally" alone, as that's true of ruby too.
We would probably all benefit in understanding better how these things are handled in other environments. And I include myself here. I think ruby's bundler really set a new standard for best practices here, and many subsequent managers (like cargo) were heavily influenced by it, although many don't realize it. But meanwhile many don't even realize what they are missing or what's possible.
Like the basic idea of having a specification of top-level dependencies (including allowable ranges) separate from a "lockfile" of exact versions in use of ALL dependencies... is just so hugely useful I never want to do without it, and I think is compatible with just about any architecture, and yet somehow JS is still only slowly catching on to it.
Kind of, if you ignore Rubygems, which is also part of stdlib at a lower level then bundler (and also, originally wasn't.)
> but bundler dependency manager solves it anyway to give you per-project dependencies not just system-wide dependencies.
It can do that because rubygems manages multiple installed versions of packages and allows per-project ("per call to require", potentially, IIRC) specification of which one to pull from the globally-installed versions (this was originally done by monkey patching require when rubygems was an add-on.) This lets bundler easily live on top of it providing per-project dependencies somewhat more smoothly than Rubygems does without requiring anything like a venv.
> Perhaps ruby was more "hackable" by bundler.
Ruby is ludicrously hackable, yes.
> (Bundler has now become part of ruby stdlib, but didn't start out that way, it definitely started hacking around the way the more fundamental stdlib 'rubygems' worked).
Rubygems also wasn't part of stdlib originally, and started out relying on hacking around the way Kernel#require works.
Oh wow, the default python dependency manager only lets you have one version of each package installed system-wide?
Yeah, that is a limitation. As opposed to rubygems (the first dependency manager although as you say not originally built-in to ruby) which has system-wide install, but always let you have more than one version installed.
Without fixing that one way or another, there's no sensible way, true. virtualenv is certainly one way to fix it. I wonder if there would have been a more rubygems way to fix it.
It’s a directory - you delete and create them at will, fast, and don’t worry or care about the system Python. Having some crazy setup that patches “require” to handle concurrently installed package versions seems insane, especially if you cannot actually use them concurrently in the same Ruby process. So, segmenting them by project (aka virtualenv) seems like the best solution.
But nothing stops you from masking global-libraries with local library versions (similar to node_modules). Why hasn't anyone done this you may ask? I don't know the answer to that.
So yes, Python’s import system is dynamic enough to do crazy things, but I don’t see how we can ever retrofit that into Python.
Regarding dependencies installed into a project-local directory (node_modules): that’s a virtual environment. Just more flexible.
For example, my experience with `cargo` (that I mostly use to install command-line utilities such as rg, fd, dust): it is great when it works as written in the instructions but sometimes it doesn't (running `cargo` may involve a lot of compiling -- in contrast to `pip` which can use wheels transparently and avoid compiling even for modules with C extensions -- I guess there might be a way to do something similar with `cargo` though not by default).
Maven Scala project - create skeleton, add libraries to POM, write app, run app
PIP Venv Python project - create venv, enable venv, create requirements file, write app, run pip to install dependencies(possibly install GCC and extra libraries), run app
(Oh... and god forbid that you forget to deactivate venv)
You're lying when you say that library management is easier in Python. It's just factually untrue.
There's no community consensus - that keeps Python from advancing to where it needs to be.
I said it once and I'll say it again - Python lacks mature tooling.
There are contexts where little delays matter, and you didn't pick one of those.
Instead, simply run the interpreter installed in the environment when you run your app, e.g. "./my_env/bin/python my_app.py", and things will just work. No activation required, no special mode, nothing to forget.
The part about requirements.txt and installing packages could also be simplified if you did it the other way around: install first and create the requirements file from that:
$ python3 -m venv my_env
$ my_env/bin/pip install some-dependency
$ my_env/bin/pip freeze >requirements.txt
$ my_env/bin/python3 my_app.py
There you go. Setup, install and run in four steps and zero modes.That's before you get to package your app...
It's literally a `mvn jar` and that's it!
If you're using python, you don't know to check out pyenv/etc until you have a huge mess on your computer due to pip's behavior.
Some of this has been mitigated with virtualenv but having a project express it's packages & have that automatically reflected in the environment.
Finally, Cargo to my knowledge actually lets multiple dependencies exist (even within the same project!!!) so that you can have a dependency like:
dep1 -- dep3 <= v1.6
/
< my awesome project> -------- dep3 >= 3.0
\
dep2 -- dep3 >= 2.0That's not possible if you don't have the right language hooks because module resolution needs to be aware of the version of the library (i.e. when you go `import numpy`, it actually needs to be aware of the package it's being imported from to resolve that correctly).
Now whether or not it's a good idea to support this kind of dependency stuff can be controversial. In practice though clearly it does cause problems the larger your codebase gets as you're more likely to have some nested dependency chain that's time-consuming to upgrade so you'd rather move faster than make sure you're only running 1 version of the dependency.
I really don't get the fuss about the global dependency management though, maybe I would change my mind if Python shipedp a great implementation of it. But I feel like the problem is already solvable in multiple ways with containers, VMs, or virtualenvs and I don't think yet another abstraction to separate environments would add much value to my day to day workflow building python apps.
And yet, I hear so many more complaints about Python pip and I really don’t understand the disconnect. Perhaps dislike of pip is actually triggered by usability issues? And then people look for other reasons to explain their dislike?
As mentioned elsewhere in this thread, resolving this dependency issue would require a change in the Python language itself.
If you're only working with the standard library, boto3, twisted and redis - you're unlikely to have issues. You get into big issues, when you get to more obscure libraries... or libraries that are C bindings.
There are per python binary, per user, per virtualenv installation (per project or per whatever you like) that make the conflict less likely.
Sometime packages "vendor" their dependencies e.g., there is `pip._vendor.requests` (thus you may have different `requests` versions in the same environment).
There were setuptools' multi-version installs https://packaging.python.org/guides/multi-version-installs/ (I don't remember using it explicitly ever -- no need)
That's a bug, not a feature. It enables sloppy development and the disasters like on NPM
If a package is just using a particular library internally, I don’t see why the package manager should prevent using it with another library that depends on a different version.
I do. The main reason for Linux distributions to exists is to provide a development and running environment where:
- API/ABIs do not change for the whole lifetime of the distribution. No new features, no new bugs, no new vulnerabilities, so that your production code can run reliably for 5+ years.
- Vulnerabilities are fixed with minimally invasive patches.
- Vulnerabilities are fixed in reasonable times even if the upstream development stopped. Patches are well tested against the set of packages in the distribution.
You simply cannot have these 3 features together if a distribution ships 10 different version of each library.
It's already a ton of work to maintain packages in stable distributions.
> Now whether or not it's a good idea to support this kind of dependency stuff can be controversial. In practice though clearly it does cause problems the larger your codebase gets as you're more likely to have some nested dependency chain that's time-consuming to upgrade so you'd rather move faster than make sure you're only running 1 version of the dependency.
Consider the view that some times it can be sloppy & other times it's not & it's impossible to distinguish between the two in an automated fashion.
That's not pip's fault, that's Python's fault. Python's module system has no concept of versioning, so there can only ever be one copy of a module that has a given name.
And this is an interpreter detail that is exposed through the language itself, so it can't be fixed without causing severe pain.
But, for the other 99% projects though: Most of their dependencies won't break compatibility, you'll never uncover a hard version dependency that the package manager can't solve, you'll never need to "freeze" your dependency versions and you can pretty much just rely on a semi-persistent environment with all your necessary packages installed and semi-regularly updated. Essentially smooth-sailing.
You realize that we're potentially just one leadership change away from returning to the 'bad old days', right?
It controlled the client (desktop) and was working on controlling the server, too.
Google, Facebook, Netflix, etc didn't exist. Amazon was much smaller and in a different niche. Apple was trying to not keel over in 2 months.
We're not a leadership change away from anything. The world has changed.
The world has changed, but I didn't mean "the bad old days when Microsoft had a stranglehold over the industry" but just "the bad old days of an evil Microsoft". Their market power isn't relevant to whether they are a bad actor, only to how large their impact is as a bad actor.
The rest is too vocal.
99% of professional python developers think that you've pulled this statistic out of your ass!
> 99% of professional python developers think that you've pulled this statistic out of your ass!
72.6% of all statistics are made up, anyway.
I doubt that even 90% of those professional python developers who believe that python dependencies is a solved problem believe that it is solved with pip and virtualenv; the conda faction has to be bigger than 10%. Plus there's the people that think pip/venv aren't enough, but that tools on top of them plug the gaps (poetry).
But I think that the share of professional developers who see it as a solved problem at all is less than 90%. Obviously, we've all got some way of working with/around the issues, that doesn't mean that we don't feel that they exist.
conda had minor usage in the last one for building a handful of special projects mixing C++ and Python code (highly specific code in the finance industry), after build the artifacts could go into the python repository (internal pypi) and be usable with pip. Everything was down to pip at the end of the day. As a matter of fact, the guys who used and pushed for conda were also the ones pushing the hardest for pip because pip is the answer to everything.
Our data scientists like Conda - but our developers don't touch it.
I struggle to see what spending time looking at Poetry will yield in terms of any actual benefit, though I would love to be informed/educated otherwise.
I don’t expect my dev tools to be idiot proof, but they should at least try to be “I’ve been hacking for 18 hours straight and I just need to commit this last line and I can finally go to bed” proof.
That prevents you from ever doing a pip install in your root environment.
I've got about 20 different pip environments, and virtualenvwrappers (workon xxxx) makes it pretty seamless for me to hop back and forth between sessions. I'm also pretty dedicated to doing all my work in tmux windows - so my state in a half dozen virtualenvs is changed by changing my window (which I've done a workon)
I guess what I'm really interested in is, "The last three years of my life I've used virtualenv/wrappers + pip, and haven't run into any problems. What can Poetry do for me, and why should I change my work habits? Genuinely interested in using new and better tools.
I don't think I've even written a setup.py .
Obviously there's a whole world of development and deployment where these things are relevant, but there's also a massive world where nobody even understands what they are missing.
"evangelized" a sibling team also to consider switching, they were sceptical but just recently they mentioned they also like it more.
The biggest need for a package manager and its ecosystem is continuity: the stance that new features and paradigms will be gradually shifted toward — without package-ecosystem incompatibilities, without CLI commands just disappearing (but instead, with long deprecation timelines), etc.
In other words, an officially-blessed package manager is one where, when something better-er comes along, it gets absorbed by the existing thing, instead of replacing it.
That is what the Python ecosystem is missing.
Last time I tried to use poetry (and this is why it was the last time I tried to use poetry), it ignored global pip settings and had no documented mechanism for its own settings (I believe poetry uses its own implementation of or captive install of pip) which made it completely unusable in a corporate environment with annoying SSL interception issues to work around where pip + venv worked.
Poetry is a much smoother experience when it works, though.
EDIT: It was probably misleading to characterize Pipenv as advertising itself as solving all problems; it’s probably more correct to say that it’s significant weaknesses weren’t advertised and thus one has to invest considerably before discovering them for oneself.
Just one example: you want your virtualenvs to be created in ~/.virtualenvs so that pipenv is a drop-in replacement for virtualenvwrapper+pip? Tough luck for you, Kenneth Reitz doesn't think that's how it should be done.
At least 3 or 4 times some issue I've wanted resolved I found in the issue tracker with the last message "we'll have to check with kennethreitz42 whether we're allowed to change that" and then silence for a year.
It could still catch up with poetry, but from what I've seen there's a fundamental mindset difference in how change requests are approached between pipenv and poetry.
I think this is happening these days frequently. People try to cover all use cases and then end up in biting more than they can chew. It won't work that way. Good set of MINIMALS, is easy to maintain, sustain and extend.
He just doesn't care about package management.
I disagree. I used to think that that's the problem, but having seen a few more cycles of it, the problem isn't that kind of commitment - after all, the whole python ecosystem enthusiastically jumps into the new thing, and Python people are used to relatively short deprecation cycles. The problems are the actual problems; every Python package manager is just embarrassingly awfully bad as soon as you try to use it for 5 minutes, presumably because they're developed by Python people who've never used a decent package manager and so think that no-one could ever need deterministic dependency resolution, once you've pinned a transitive dependency there surely wouldn't be any reason to ever want to unpin it, having the package manager coupled to the language version is absolutely fine, no-one could ever want a standard way to run tests ...
Given the varied use cases for Python, the goal of a single package manager may be misguided.
That was a long time ago, though, when scientific computing was a small niche for Python. It might have been reasonable to say it's not worthwhile to take on all that extra work just to support the needs of a small minority of users. Fast forward the better part of a decade, and it turns out that scientific computing did not stay a small niche. I think that one could make a strong argument that, in retrospect, that brush-off did not end up ultimately serving the best interests of the Python community. It made the community more fragmentary, in a way that divided, and therefore hindered, efforts at addressing what has proven to be one of Python's biggest pain points.
[1] https://en.wikipedia.org/wiki/Pip_(package_manager)
[2] https://github.com/conda/conda/tags?after=1.3.0
[3] https://github.com/conda/conda/commit/c9aea053d8619e1754b24b...
I forgive myself, it's pretty confusing :D.
It is true that PyPi was designed before the author/project naming scheme popularized by github. Other than that I don't see a greater problem with name collisions in Python.
That's why a strong leadership in a community, or subcommunities, works well. Python lacked this leadership, that leads to millions of half-arsed projects that compete... without moving the whole platform forward. It feels like NIH syndrome has permeated Python. Hopefully that's going to change
I think it's because they have their own internal build systems, but they never play well with pip/conda et al.
One of my recent breakages was installing the recsim package, which pulled in tensorflow and broke my entire app. There's actually a recsim-no-tf package on PyPi, presumably because this happens to loads of people.
The core problem is that pip will happily overwrite your existing dependencies when you attempt to install a new package.
- no way to check if the lock file is up to date with the toml file
- no way to install packages from source if the version number is calculated (this will likely never be fixed as it's a design decision to use static package metadata insetad of setup.py, but is an incompatibility with pip)
- no way to have handle multiple environments: you get dependencies and dev-dependencies and that's it. You can fake it with extras, but it's a hack
- if you upgrade to a new python minor version you also have to upgrade to the latest poetry version or things just fail (Something to do with the correct selection of vendored dependencies. May have since been fixed -- new python versions don't come out all that often for me to run into it. And in fairness the latest pip is typically bundled with each python so it avoids that issue)
I still use poetry because it's more standard than hand-rolled pip freeze wrapper scripts, and there's definitely progress (the inability to sync packages was a hard requirement for me but is not fixed) but it's not quite there yet
I migrated the CI/CD of my company to Poetry some time ago, it worked fine for some time until we needed a feature that Poetry didn't support. I submitted a PR adding the feature to Poetry but their sole developer was apparently taking some time off and the project remained without any development for several months.
I migrated the CI/CD to use my own Poetry fork but it was very cumbersome, Poetry has a very weird build system so forking it is not simple.
At this point, I realized that I was just wasting time. There is nothing that Poetry does that the other (old and stable) tools don't do. Poetry was the result of me falling for the shiny toy syndrome.
Have never used cargo - what can cargo do that conda cannot?
Alternatively, what does cargo do better than conda if they are not feature-for-feature comparable ?
https://docs.conda.io/projects/conda/en/latest/user-guide/ta...
i've never used it particular feature, but then i'm using python since 1.5 and i'm just used to it being a bit behind the times. stockholm syndrome, you might say, especially after trying out rust and seeing the work of art cargo is.
There are more, but those are the big three.
I used conda to manage 2.6, 2.7 and 3.3 side by side, a d that was fine. I never locked the patch version (e.g. 2.7.3 vs 2.7.5) though that is definitely possible.
It apparently requires a specific workflow - explicitly editing the requirements.txt file, rather than freezing it - which is not harder and which I was doing since day 1 but is apparently uncommon.
(And it worked well across a few tens of machines, some running windows and some running Linux, with a mix of os versions and distributions. So I know it worked well already in 2013, and I’m sure it works better now).
Speed is not good, but I never had it take more than a minute for anything. Some people here are reporting 15 minutes resolution times - that is a real problem.
You make sure everyone uses the same Python version by setting it as a dependency. I mentioned I only set the dependencies on minor version (e.g. 2.7) rather than path version (e.g. 2.7.3), but the latter is supported - for the python version as well as for any other package.
You make sure the exact versions you want are in use by editing and curating the requirements.txt rather than freezing it. It really is that simple, but somehow that's not a common workflow.
prod vs. dev is the only one I didn't address because I don't have experience with that - but I know people who manage "requirements_prod.txt" vs "requirements_dev.txt" and it seems to work for them.
A better question, what’s your workflow for installing a dependency and 6 months later updating that dependency?
That’s basically the whole idea of conda’s solver, I think. If your list works - fine. If n9t, it will find a set of package installs that makes it work.
I guess that’s also why my resolution times are way faster than what some people describe.
I treat requirements.txt closer to a manually curated lock file than a wishlist (which most req.txt files in the wild are).
But manually curating the dependencies has been painless and works fine for me and my team for almost a decade now.
I'm unsure what are the core issues, but in my experience cargo was always pretty quick to use and if it fails, it fails fast.
Conda on the other hand is slow for the simple cases, and if the graph becomes complex it will just churn for 15 minutes before throwing it's hands in the air and giving up with some cryptic error.
I suspect it comes back to the fact that packaging and dependency management was thought about upfront for Rust and the whole ecosystem was built well from the get go?
> This is due to the fact that not all libraries on PyPI have properly declared their metadata and, as such, they are not available via the PyPI JSON API. At this point, Poetry has no choice but downloading the packages and inspect them to get the necessary information. This is an expensive operation, both in bandwidth and time, which is why it seems this is a long process.
Cargo doesn't need to do anything with packages directly to do its job; everything it needs is in the index. This makes it pretty fast.
This sounds like something that could be done server side, either by PyPI or another entity and expose it through a new API endpoint, instead of doing it on every Python developer's machine.
https://dustingram.com/articles/2018/03/05/why-pypi-doesnt-k...
The two worst are in the other comments: ensuring sync'd dependencies across multiple environments and developers, and the horrendous resolution times leading to a useless error message when failures occur.
You found a bug report for a problem specifically on fish on MacOS, which can be resolved by "deactivate / reactivate" according to the discussion.
Were you trying to say something?
Nope.
What are those "workspaces" you refer to?
What is "feature selection"?
Need something like cabal. And a package index.
Python is plenty fast for most automation tasks.
Projects like Cython allow to tweak without too much effort the parts of a program that need an extra-boost.
Last but not least, there have been discussions in the Python community in the last weeks of ways to speed up considerably the default (CPython) implementation.
Hopefully, all of this will bear some fruits in the next 2-5 years. Guido will probably help from his new position at Microsoft.
This piqued my interest. I found this, by Mark Shannon: https://mail.python.org/archives/list/python-dev@python.org/...
Is that what you mean?
Try building a Unix app, with data in standard Unix locations(bin, shared, lib, etc) and you'll find that you have to write custom code.
And Google searches don't help :(
At this point, this criticism has become a "thing" that no one really expands on or enumerates as if it's a given. It's not a given, and at the very least is nuanced and complicated.
No doubt that Python is sometimes fast enough (e.g., vanilla CRUD apps that do all of the heavy lifting in Postgres), but sometimes it’s not and you’re left with really crumby optimization options. And since we rarely can know with certainty on the outset of a project whether or not the bottlenecks will be amenable to the optimizations afforded by Python, it’s a dangerous game. I would even go so far as to say that other languages have become quite good at many of the things that Python is good at (namely pace of development) while being much better at the things that it’s not good at (performance, package management, etc), so I actually wouldn’t recommend starting new projects in Python except for certain niches, like scientific computing (and who knows if Python will even retain its dominance there).
As for scientific computing domain, I would start a new project in Julia rather than Python.
[1] https://benchmarksgame-team.pages.debian.net/benchmarksgame/...
[2] https://github.com/frol/completely-unscientific-benchmarks
[3] https://www.techempower.com/benchmarks/#section=data-r19&hw=...
The XKCD comic on Python package managers/Python environments is not an exaggeration. I've always wanted to get more into Python but every time I attempt to, it's this hurdle that dissuades me.
Edit: Also, I guess Poetry is another thing that came along since my last attempt.
Thanks, I haven't seen it before. It's really quite close to the state on my home machine:
It's not that I couldn't eventually resolve the current state, it's that at the moment a few programs I regularly run work, in spite of the different dependencies they have, and I know that starting "cleaning up" will cost too much time.
> Thanks, I haven't seen it before. It's really quite close to the state on my home machine:
Hmm. I've had machines with similar states, though never with both Anaconda and Homebrew.
Instead, I often had (in addition to the rest of the system-level snarl) isolated per-app Python interpreters that were specified & constructed with Buildout for development testing & deployment.
Though I don't quite get the arrow from Homebrew 2.7 to Python.org 2.6. Is that actually a thing or hyperbole?
It's fiction, of course. Art often has to exaggerate to make a point. I exaggerated too, just to remain in the artistic rather than the technical spirit of the comics. But there are some important bits of truth there, like in every good joke.
I thought C and C++ might have similar issues since there's no unified package management there either.
But a plurality of the people I encounter in the Clojure community came there because leiningen (Clojure's package manager that uses Maven under the covers) "just works" and they got tired of having a tough time reproducing builds consistently on other platforms / OSs with Python; not to mention the performance gains of the JVM.
I strongly suspect that devs' satisfaction with Python is strongly correlated with the size of the codebase they're working on. Generally people using Python for one-off projects or self-contained tools tend to be pretty happy. People stuck in sprawling enterprise codebases, with O(million) lines of code to wrangle, seem almost universally miserable with the language.
What I've observed a lot is that many startups or greenfield projects start with Python to get an MVP out the door as fast as possible. Then as the scope of the software expands they feel increasingly bogged down and trapped in the language.
I've seen the exact same scenario with other languages. The problem is that in a start up environment you are likely adding amd retiring more "features" at a speed that layers so much complexity that you can no longer reason about what business rules are actually valid any more.
It wouldn't surprise me if many of these issues are self-selecting in the language communities as well.
Which is still wrong, of course, but "no in-process (or in-single-runtime-instance) parallelism" would be correct, as would "forking inconvenient parallelism".
Pretty much any app that uses both fork and threads, has to jump through many hoops to make the two work together well. And this applies to all the libraries that it uses, directly or indirectly - if any library spawns a thread and does some locking in it, you get all kinds of hard-to-debug deadlocks if you try to fork.
So unless you have very good perf reasons to need fork, I would strongly recommend multiprocessing.set_start_method("spawn") on all platforms. No obscure bugs, and it'll also behave the same everywhere, so things will be more portable. Code using multiprocessing that's written to rely on fork semantics can be very difficult to port later.
To claim that a language "supports parallelism", it has to do something more to facilitate parallel programming. I would say that parallel threads of computation with shared memory and system resources is the bare minimum. You can go the extra mile and support transactional memory or other "nice" abstractions which make parallel programming easier.
Saying that Python support parallelism because it has a fork() wrapper is like saying that Posix shell is a strongly typed language because it has strings and string is a type.
This was probably a conscious design decision on the part of C Python implementers and perhaps a good one. But we should not claim that Python is something which (actively and by design) it's not.
Or even worse - could you imagine how many lines that would be in C++ ?
Yowza!
Otherwise its a thousand implementations of the same 100-line piece of code interspersed everywhere.
Which is strange because those same managers may be full adherents to micro tasking projects in a project management system whose purpose is basically to do for the project what code management does for the code itself.
In my workplace, we've recently had leadership that appreciates these things, and the difference is night & day. Simple requests from "stakeholders" (I hate that term) are often filled in days, or same day, instead of weeks. I think it helps tremendously that the primary manager is also a coder herself, and still codes ~25% of her job.
I believe it's Guido that basically said - if you don't like how Python does it, then implement it in C. And that's how you end up with great C based libraries bound to python... and python is often used as a messy orchestrating language.
Not all codebases are equal and maybe I was lucky, but in my experience, using dynamic languages (or, to be exact, any language where the compiler doesn't nag you when there is a potential problem) doesn't scale well.
Large codebases are really hard reason about without types. I'm glad we now have projects like Pyre that are trying to bring typing to Python.
Can you explain why? I honestly don't know, because my experience with C++ was during school ~20 years ago, and since then professionally I've used mostly python in relatively small codebases where it's all my own code (mostly for data processing/analysis). Thanks!
(Although I did have to write some C code to glue together data in a very old legacy system that didn't support C++, much less python. It took a lot more effort to do something simple, but it was also strangely a really rewarding experience. Kind of similar to feeling when I work with assembly on hobby projects)
Static typing prevents that by telling you early where the mismatch is happening - some method calls into another with a variable of the wrong type, and that's where the bug is. It also allows tooling to look up the types of variables and quickly get information about their properties.
If you can define methods on an object dynamically in Python, it doesn't mean that you should. Monkeypatching is not encouraged in culturally in Python. Most often it is seen in tests otherwise, it is rare.
Nobody forbids using ABCs to define your custom interfaces or using type hints for readability/IDE support/linting (my order of preference).
large python code bases _could_ be written with well modularized, clean separation of concerns and composability. Or it could be written in spaghetti.
Using types _could_ help a code base from becoming spaghetti, but it's not the only way. I think the understandability and maintainability of a code base has more to do with the person writing it than the availability of a type system tbh.
The issue is that to have a nice and well architected code base, you have to constantly refactor and improve - sometimes you need to re-arrange and refactor huge parts of the code. Without types _and_ tests, this is just not gonna happen. It will be unproductive and scary, so that people will start to stop touching existing code and work their way around it.
> I think the understandability and maintainability of a code base has more to do with the person writing it than the availability of a type system tbh.
That is the same thing. Because someone who wants great maintainability will also want a great type system (amongst other things).
The quality of the product is down to the skill of the worker either way.
The same with types: they make some kind of errors much less likely though there is no silver bullet in general e.g., I much prefer a general purpose language such as Python for expressing complex requirements in tests over any type system (even if your type system is turing complete and you can express any requirement in it; it doesn't mean it is a good idea)
Everything interlocks in such intricate ways that you can't meaningfully choose your own tools, and working around problems only goes so far. And you can't repair your own tools.
The Scala Spark project I can navigate, understand, test and consider to be average complexity... with some failures, unique to Scala.
The Python Spark project is barely readable.
People who built the Python Spark codebase are "experienced Python devs". While Scala codebase was built by people who used Scala for the first time.
(take this anecdote, as evidence for the poor tooling and guidance present in python community.... and BDFL's own failures)
Dependency management is about as easy as it is going to get. We have problems with our dependencies breaking stuff, but who doesn’t?
People talk as if packaging is a solved problem. It isn’t in any language. And then they complain that Python packaging changes too much. That’s because folks are iterating on a hard problem.
Once a pip install needs to start compiling C, things do go way south very quickly. At that point you can install the union of all common C development tools, kernel headers and prepare for hours of header hunting.
I've done that too much to like python anymore.
Additionally, they are part of a larger application, which is mostly managed by pip, which means that I need both pip and conda which is where things get really, really hairy.
I actually blame Google and FB here, as neither of them use standard python dependency management tools, and many of their frameworks bring in the world, thus increasing the risk of breakage.
And putting them into a common shared directory.
Try doing that without writing convoluted code in your setup.py.
- `curl -L https://app.example.com/install | sh` that downloads installer and runs for instance: apt/yum install <your-package>
- in CI environment on a VM: `git checkout` & `pipenv install --deploy`
- `pipx install glances` on a home computer
- just `pip install` e.g., in a docker container [possibly in a virtualenv]. For pure Python packages, it can work even in Pythonista for iOS (iphone/ipad)
- just copy a python module/archive (PyInstaller and the like)
- give a link to a web app (deployed somewhere via e.g., git push)
- for education: there are python in the browser options e.g., brython, repl.it, trinket.io, pythontutor.com
- just write a snippet in my favourite editor for literate devops tasks/research (jupyter-emacs + tramp + Org Babel) or give a link to a Jupyter notebook
- a useful work can be done even in a REPL (e.g., Python as a powerful calculator)
I dare you. Do mention any tool/any language that handles all the above use cases without sacrificing the requirements for each use-case.
- system packages (deb/rpm/etc)
- binary wheels (manylinux)
- building from source
plus some caching if appropriateTo take your examples in order:
1) system packages: almost always out of date for my needs
2) Binary wheels: I actually haven't investigated this much, maybe it will work (and if it does, I'll buy you a drink if we ever meet in person).
3) Building from source: this kinda proves my point about Python having poor dependency management tools if this is a serious response. In general, this would be much further down the rabbit hole than I want to go.
No. But if I talked about how I used 9 different word-processing programs, you'd see that as a problem, or at least an indictment of those programs. Deployment isn't that complicated.
> I dare you. Do mention any tool/any language that handles all the above use cases without sacrificing the requirements for each use-case.
I use Maven/Scala and as far as I can see it covers all of them other than "give a link to a web app" which isn't actually deploying at all (and I'd still have used maven to deploy the webapp wherever I was deploying it).
I don't think there's any legitimate case for curl|sh, and I don't think there's any real reason for separate pip/pipenv/pipx (did you make that one up? Have I fallen for an elaborate troll?) - rather pipenv exists to work around only being able to install one version of a library at a time. Nothing's gained by having "just copy a module/archive" be different from what the tool does. Running in browser, notebook, or REPL can and should still use the same dependency management tooling as anything else.
If I want to deploy my code, I use maven. You can use curl (since maven repositories use standard HTTP(S)) or copy files around by hand, if you have a use case where you need to, but I can't think what that would be. If you want to bundle up your app as a single file, you can configure things to do that when publishing, but the dependency resolution, repository infrastructure, and deployment still look the same. Even if you want to build a platform-level executable, it's the same story, all the tooling just works the same. If I want a REPL or worksheet, I can start one from maven (and use the same dependency management etc. as always), or my IDE (where it's still hooked up to my maven configuration). If I want to use a Zeppelin notebook then there's maven integration there too.
Ever wonder why you don't hear endlessly about different ways of doing dependency management in non-Python ecosystems? Because we have tools that actually work, and get on with actually writing programs. It baffles me that Python keeps making new tools and keeps repeating the same mistakes over and over: non-reproducible dependency resolution, excessively tight integration between the language and the build tools, and tools and infrastructure that can't be reused locally.
That said, I do run into trouble when I have a dependency that requires compilation on Windows (i.e. like the popular turbodbc) because say, a wheel isn't available for a particular Python version. Any time a compilation is needed, it's a headache. Windows machines don't come with compilers, so one has to download and install a multigigabyte Visual Studio Build Essentials package just to compile. Sometimes the compilation fails for various reasons.
Require gcc compilation is headache for installing dependencies inside Docker containers too -- you have to install gcc in order to install Python dependencies and then remove gcc after.
I think requiring local compilation (instead of just delivering the binary) is a UNIX-mindset that is holding back many packaging solutions. I think a lot of pain would be alleviated if we could somehow mandate centralized wheel creation for all Python versions, otherwise the package manager marks a package as broken or unavailable and defaults to the last available wheel.
Also if only we applied some standards like R's CRAN repo does -- ie. if it doesn't pass error checks or doesn't build on certain architectures (institute a centralized CI/CD build pipeline in the package repo), it doesn't get published -- the Python packaging experience would be much improved.
For those who don't realise, when there's a new version of R, anything that doesn't build without errors/warnings is removed from the archive.
This is really annoying if you want something to keep running, but it prevents the kind of dependency rot common to Python (recently I found a dependency that was four years out of date).
Deployment for development is just pyenv and virtualenv.
It you are trying to get performance out of it (which doesn't really hinge on whether it's a million lines of code), then Python might be the wrong choice. But you can always write it in Rust or C and give Python an API to the functionality.
I agree that packaging is a mess. Fixing that mess with modularization in Java took a long time, and most other languages have that problem, too.
Explicitness and naming standards screw up the clarity of any code... Not to mention the complexity when you get into OOP.
> doesn't scale well.
Nothing scales well. scaling requires lots of effort. It doesn't matter what language you use, you'll rapidly find all its pain points.
> bad packaging when there's a lot of cross-cutting dependencies
Much as I hate it, docker solves this. Failing that poetry or if you must venv. (if you're being "clever" statically compile everything and ship the whole environment, including the interpreter) its packaging is a joy compared to node. Even better, enforce standard environments, which stops all of this. One version of everything. you want to change it? best upgrade it for everyone else.
> slow performance
Meh, again depends on your use case. If you're really into performance then dump out to C/C++ and pybind it. fronting performance critical code in python is a fairly decent way to allow non specialists handle and interface performance critical code. Its far cheaper to staff it that way too. standard python programmers are cheaper than performance experts.
If we are being realistic, most of the time 80% of python programs are spend waiting on network.
Granted, python is not overly fast, but then most of the time your bottleneck is the developer not the language.
> no concurrency
Yes, this is a pain. I would really like some non GIL based threading. However its not really been that much of a problem. multiprocessing Queues are useful here, if limited. Failing that, make more processes and use an rpc system.
> typing as second-class citizens
The annotation is under developed. being reliant on dataclass libraries to enforce typing is a bit poop.
> People stuck in sprawling enterprise codebases, with O(million) lines of code to wrangle, seem almost universally miserable with the language.
I work with a _massive_ monorepo. Python isn't the problem, its programmer being "clever" or making needless abstractions of abstractions. None of that is python's issues, its egotistical programmer not wanting to read other people's (un documented) code. And not wanting to spend time make other people's code better.
This is very important. A lot of people think that just using go or rust or whatever other language is new fixes all of this. But with a big enough project, you'll find all the issues. It's just a matter of time.
I love Python's bignum arithmetic when I write small prototypes for public key cryptography. I love Python's extensive standard library when I'm scrapping a couple web pages for easier local reading. But I would never willingly chose it for anything bigger than a few hundred lines. I'm simply not capable of dealing with large dynamically typed programs.
Now if people try Rust or OCaml with the mentality of an early startup's Lisp developer, they're going to get hurt right away ("fighting the language" and "pleasing the compiler" is neither pleasing nor productive), and they're going to get hurt in the long run (once you've worked around the language's annoying checks, you won't reap as much benefit).
If you'll allow the caricature, don't force Coq down Alan Kay's throat, and don't torture Edsger Dijkstra with TCL.
No, docker doesn't solve the fact that some packages just won't play nicely together. NPM actually does this better than the python ecosystem too since it will still work with different versions of the same dependency. You get larger bundle sizes but that's better than the alternative of it just flat not working.
When I have to revisit old code I've written, I occasionally encounter my "cleverness" at the time. I always hate that past version of me. I think I've mostly learned my lesson. I guess I'll know in a few years.
...I feel attacked.
>Nothing scales well. scaling requires lots of effort.
Sure, just like all PLs have their flaws, and most software has security vulnerabilities. But it's a question of degree and the tendency of the language. Different languages work better in different domains, and fail in others, and what Python is specifically bad at is scaling.
If only for the lack of (strong/static) typing and the relatively underpowered control flow mechanisms (e.g. Python often using exceptions in their stead)... While surely all languages have pain points that show up at scale, Python still has a notable lot of significant ones precisely in this area.
>docker, poetry, venv...
Yes, and this is exactly the point. There's at least three different complex solutions, none of which can really be considered a "go-to" choice. What is Rust doing differently? Hell, what are Linux distros doing differently?
>If you're really into performance then dump out to C/C++ and pybind it.
If you want performance, don't use Python - was the parent's point.
>If we are being realistic, most of the time 80% of python programs are spend waiting on network.
This really, really doesn't apply to all of programming (or even those domains Python is used in). Besides, what argument is that? If it were true for your workload, then it would be so for all other languages too, meaning discussion or caring about performance is practically meaningless.
>Granted, python is not overly fast, but then most of the time your bottleneck is the developer not the language.
Once again, this applies to all languages equally, yet, for example, Python web frameworks regularly score near the bottom of all benchmarks. I doubt it is because of the lack of bright programmers working in Python, or the lack of efforts to make the frameworks faster.
>Python isn't the problem, its programmer being "clever" or making needless abstractions of abstractions.
Just as C isn't the problem, it's the programmer forgetting to check for the size of the buffer, and PHP isn't the problem, it's the programmer not using the correct function for random number generation.
You can always trace any given error to a single individual making an honest mistake, that's really not a useful way to think about this. It's about a programming language (or an environment) leading the programmer into wrong directions, and the lack of safety measures for misguided "egotistical programmers" to do damage. You can blame the programmers all you want, but at the end of the day, the one commonality is the language.
Now Python is still one of my favorite languages, and I think that for a lot of domains, it really is the right choice, and I can't imagine doing my work without it. But performance and large, complex systems, is not one of those domains, and I honestly feel like all you've said in Python's favor is that other languages are like that too, and that it's the fault of the programmers anyway.
The is a points that I think I've failed to get over:
> Just as C isn't the problem, it's the programmer forgetting to check for the size of the buffer, and PHP isn't the problem, it's the programmer not using the correct function for random number generation
I don't think I was arguing that point. of course all languages have their USP. My point I wanted to get across is that large python projects are not inherently hard to manage. That kind of scaling is really not that much of an issue. I've worked on large repos for C, C++, python, perl, node and as a punishment, php. The only language that had an issue with a large codebase was node, because it was impossible to build and manage security. The "solution" to that was to have thousands of repos hiding in github.
The biggest impediment to growth was people refusing to read code, followed swiftly by pointless abstractions. This lead to silly situations where there were 7-12(!) wrappers for s3 functions. none of them had documentation and only one had test coverage.
As for processing scalability - Python is OK, but it's considerably hampered by BDFL's own opinions. The result is a few third party libraries that implement parallelism in their own way. That functionality should be integral to the standard library already. The worst part is lack of standard API for data sharing between processes.
> packaging
Python's packaging issues only start with package management. Setuptools is a wholly mess of a system, that literally gave me headaches for the lack of "expected features". I hate it with every single cell in my body.
And then there are systems and libraries, where you literally cannot use docker (Hello PySpark!).
>read other people's (un documented) code
I lolled! Seriously... We get Python fanboys moan about how indentation makes everything more readable and it's a pleasure to write code in python. Give me a break!
This seems to be the case with most languages, especially if good code control isn't practiced, and unfortunately that's not uncommon.
It's like getting on a roller coaster without a seat belt or a guard rail. It's fun at first, and you will make it around the first few bends OK ... then get ready ...
Of course, with enormous discipline, skill and effort you can overcome all this. But it just leaves the question - really, is this the best tool for the job in the end? Especially when you are paying for it with horrifically bad performance and other limitations.
Part of the success of IG's large Python codebase is FB's investment into developer tooling; for example, FB wrote (and open-sourced, FWIW) our own PEP-484 compliant type checker, Pyre [1], because mypy was too slow for a codebase of our size.
Frustrated like you, I wrote my own open source type checking library for Python. You might be interested to read about it here: https://github.com/kevinarpe/kevinarpe-rambutan3/blob/master...
I have used that library on multiple projects for my job. It makes the code run about 50% slower, on average, because all the type checking is done at run-time. I am OK with the slow down because I don't use Python when I need speed. My "developer speed" was greatly improved with stricter types.
Finally, this isn't the first time I wrote a type checking library/framework. I did the same for Perl more than 10yrs ago. Unfortunately, that code is proprietary, so not open source. :( The abstract ideas were very similar. Our team was so frustrated with legacy Perl code, so I wrote a type checking library, and we slowly applied it to the code base. About two years later, it was much less painful!
For it's age and popularity - the tooling is abysmal.
I have to rewrite too many things, that I expected to just be there for the age of the project.
And some things were only fixed now! dict + dict only started to work with 3.9!
It should be heavily promoted as the official option and included with the distribution.
I was already in love with Python, but Poetry has definitely made me a much happier Python developer.
(Although the maven package ecosystem seems ideal to me, Gradle is just "good enough" - it's mostly the standards around versioning and tooling dealing with versioning and everything being there that makes it good to me).
You don't want that. When companies "sponsor" things they try to take them over, unless it's a pure donation, which is rare. The community then drops out because a company is in control. Later the project is abandoned by then company. It's a slow death spiral.
I would love if Guido could create a new PEP for extending modules with generic namespaces, ala Perl/CPAN modules.
There aren't 15 different libraries for doing the same thing in Perl, there's 1. You never replace it, you extend it by making a new module in a hierarchical namespace. The same core library's code might not change in years while new extensions can keep popping up. So even if you think Requests sucks, you can make Requests::UserAgent which inherits Requests code and extends it / gives a better interface. And these can be written & packaged by completely different authors.
Then maybe Pypi wouldn't have 5,000 nearly identical yet mostly unusable modules, or modules with nonsense names.
https://guix.gnu.org/en/blog/2019/gnu-guix-1.0.0-released/
https://guix.gnu.org/en/blog/2020/gnu-guix-1.1.0-released/
If anything, this further corporate influence on Python development is not something to be applauded. I bet there will be lots of more churn in the next five years, big announcements and no results.
Same customer, another project, I'm experimenting with a deployment system based on git format-patch. It copies the patches on the server (we have only one server) and applies them with patch. Then restart the web app.
It's fun to learn the internals by rewriting the tooling but a good tooling to start with would be better.
That is some reasonable way to deploy to someone who is not a programmer nor tech person.
Not sure how much has changed since this was written: http://effbot.org/pyfaq/can-python-be-compiled-to-machine-co...
PyInstaller.. well.. it works okay with std.. sometimes it does not. It is the Electron solution.. add pandas to a project and you get a 600MB install.
As developers we can manage to deal with package managers.
1. Install foo
2. No not that foo!
3. Reinstall python
4. Goto 1
I guess he is going for a Diocletian cabbage farmer style retirement.
This is cool though. I'll be curious to see what he works on.
And to be clear: If you are unable to solve these common algorithmic questions that companies like Microsoft ask, then that's not the right place for you to work. This is a tangent, but there are literally thousands of companies that won't require you to solve these problems. The thing is, at Microsoft & co. you don't just do this in an interview. You do it at your job too. We do foundational work in many teams and we need to solve algorithmic problems practically every week. If you are unable to code yourself out of a DP problem or scared of NP completeness and approximation algorithms, then maybe find a different job instead of complaining about the interview process?
Google or Wikipedia can tell you who Guido van Rossum is.
1. This is Guido van Rossum. If I were him and asked to solve puzzles, I'd tell the hiring company to fuck off.
2. These quizzes aren't so bad, but the pressure and stakes make it incredibly stressful. There's no standard, and often times the interviewer is the one that sucks.
> We do foundational work in many teams and we need to solve algorithmic problems practically every week. If you are unable to code yourself out of a DP problem or scared of NP completeness and approximation algorithms, then maybe find a different job instead of complaining about the interview process?
I'm pretty sure your opinion here is not that of your employer.
When I was leaving Google the first time, I asked my skip lead (who was employee #48 there, ended up running all of Search, and was previously a core HotSpot engineer at Sun) why he chose to work at a small startup when, coming off of HotSpot in 1999, he could work anywhere. He replied "Aside from them being one of very few companies with an engineer-centric culture, they were the only company that required I interview. Everybody else was willing to hire me on the spot."
For some personality types - and particularly the ones likely to do world-class work - being challenged is a positive sign. It means that the employer does their due diligence, and they will mostly be working with other people who react positively to a challenge.
To me, due diligence would be more like using software that someone has created. If it feels snappy then they're good enough at algorithms for the kind of software that they create, if it doesn't then maybe it's worth looking into whether or not there's a good reason for that.
Like if you apply for a job at the NYT, I doubt they make you do a timed writing test with people staring at you and asking you questions in the middle. They probably just read some of the previous work you've done.
I do not want to work with anyone who finds that getting their hands dirty is beneath them. It is very, very rarely going to be a good use of their time to do those problems. It will often be a good use of their time to teach those problems. A senior engineer, even one who’s unlikely to work with junior engineers on a regular basis, will need to explain their thinking. They need to show humility and compassion. Those are practiced attributes. This precise situation is the best practice you can get - New and Unknown person, some amount of challenge and complexity involved.
Thinking that whiteboarding problems are a bad use of time is a very strong signal for a senior person who is out of touch.
(Unfortunately this happened in a small Eastern-European country, so the company was an investment bank, not Google.)
It's really scary to go to company that is willing to hire you without ever talking to you.
When you are considering hiring a nobody, this is acceptable. You will interview multiple people, and they will interview at multiple places, so the randomness isn't that important.
But if you want to hire one specific guy as a strategic hire, suddenly the randomness may no longer be acceptable.
Not sure what you're trying to get at:
MacOS homebrew creator is an effin nobody compared to Guido, therefore he should "know his place", "get in line" and invert a binary tree on the whiteboard and act like an obedient tech interview candidate that he really is?
OR
MacOS homebrew creator should've told Google to fuck off?
And I'm willing to bet when Google hired Guido in 2005, they didn't put him through a coding challenge humiliation clown show day.
"The US constitution is like an overgrown enlightenment dissertation. The founding fathers did a good job at growing the United States, and this is a great achievement! It requires certain personal traits not everyone has. But at a technical level, they made many beginner's mistakes when drafting the constitution, which the country tried to fix later, but not always successfully."
:-P
You'd certainly be wrong to assume that Americans are all in favor of our foreign policy, to say the least. Aside from that, some of the downsides to the US constitution that inspired my comment include the way the founding fathers totally failed to anticipate that the nation would be completely polarized by a two party system, and that this polarization would happen along geographic lines.
Admittedly, this compromise whereby rural states with lower populations enjoy disproportionate political representation is baked into the constitution being agreed to in the first place (the 3/5ths compromise being relevant here as well). As we've moved to more direct democracy, with things like the electoral college being bound to the (local) popular vote and the direct election of senators, the original intentions of having a federation of mostly autonomous states becomes more and more anachronistic, while still fueling an increasingly polarized electorate that pits high-tax revenue and high population centers like SF and NY against low-tax revenue and low population centers that make up most of the country.
The United States is large geographic region with a heterogeneous economy. I don't know if a parliamentary form of government would have served this kind of country well, but certainly most friends from abroad who have spoken to me on the subject have implied that proportional representation is far more sensible than FPTP voting, and that parliamentary forms of government avoid the gridlock and polarization that our de facto two-party system engenders.
Please find me another "Masters Project" that has 8 Million+ Users and drives the backend for thousands of tech companies worldwide. Good Luck.
If you think a single function is equivalent to an entire Language you should get your head checked.
Yes, that's exactly what he should have done.
That would be amusing, but he'd have to be disguised, as he's rather recognizable, having done a lot of 'State of the Python' talks and the like.
He doesn't look as much like Rick Moranis as he used to, though, so that helps: https://gvanrossum.github.io/images/Guido@200dpi.jpg
""" Python's BDFL-emeritus, Distinguished Engineer at Microsoft, Computer History Fellow. Opinions are my own. He/him. """
I really just want to thank you for putting this useless mentality on display.
I think it's my favorite example of how crazy some interview processes can get, lol.
The real question is why Larry Summers is going to a quant interview? Did he apply for a quant role?
Almost 30 years of BDFL of Python, sorry don't care, go do 200 leetcode before talking to us. And if you don't spit out the answer a few seconds faster than that fresh graduate, clearly you're a lesser engineer and should be rejected.
It works here on HN too, many of my comments are upvoted jokes and I liked yours. It's sad it attracted animosity though.
I like browsing HN mostly for the interesting discussions, but I enthusiastically take the occasional jokes that come with them.
(I might have been upvoted by people taking my jokes seriously now that I think about it. I don't know if this is a terrifying or a funny thought!)
I had a Nobel Prize winner as a physics professor in college who got three successive different wrong answers when attempting a freshman physics problem in office hours. That doesn't mean that physics isn't the right place for him to work.
not going to debate that, but I'm curious, what do you rank as #1 and #2?
We should not give too much importance to this, but the fact is that Python is now ranked consistently #1, #2 or #3 in sufficiently many rankings to consider it seriously.
That list is ranking languages by current popularity, though, rather than 'importance'.
I'd define 'importance' as more along the lines of "amount of havoc created if all software written using that language were broken/deleted at once".
No way they even considered doing it... That's for people out of college...
If you are applying for a principal or higher engineer role and your job involves coding, you are asked coding questions. May be not just focused on a complex bookish algorithm only, but rather more close to a real life distributed programming / synchronization problem etc. for example.
The problem is rewarding rote memorization in a whiteboard interview, at the expense of actual understanding, and ability to research the problem.
Table stakes for what exactly?
If the profession being discussed is "academic work in Computer Science", sure.
If it is "software development", those things absolutely are not really "table stakes".
If it is "software engineering", then I don't think there is broad consensus on what that profession even is, much less what table stakes in it are.
No, nor do I think he was he hired for the other thing I discussed, academic computer science. The post I was responding to made a general comment about "CS graduates" and "our profession"; I was responding to that. Whether that post itself was material to, or merely tangential to, the discussion of GvR's hiring at Microsoft is an argument that, while perhaps interesting to some, was not the focus or concern of my response.
I would have thought that if you actually needed people to perform under pressure, you would design your test explicitly around that, instead of using “comfort with the whiteboard” as a proxy...
Do you mean it should be used as an actual speed test?
Lol! I'd bet my year salary they didn't.
That being said, ability to solve coding problems efficiently (not necessarily spit A* graph algo in sleep), but a decent close to real life coding challenge is fair game.
Programmer here. It's true. I deal with NP completeness every day.
(that said, my path to being hired did involve writing a sudoku solver, but that wasn't in an interview for a position at Microsoft)
My story likely isn't replicable, but everyone has to find their way
I interviewed for Citus a couple weeks before they announced being acquired. I found out about the acquisition on Hacker News before having received an offer. They were able to get me in without going through the hiring process again
Initially I'd be moving to San Francisco but I wasn't eligible for any visas as I don't have a post secondary education. Staying in Canada's worked out
Some examples of things working out here: I was asked to implement some parsing, & well that's not so hard when you've written a Lua parser a year beforehand: https://github.com/serprex/luwa/blob/master/rt/astgen.lua (an astute reader will notice I don't handle precedence here, which is pretty important for arithmetic parsing. That's because I opted to implement shunting yard during codegen phase)
What value does this story give a reader? I only think it'd serve to continue an argument about how not everyone is so lucky, which isn't the original argument of "unless you're VP/Distinguished Engineer, not even Guido van Rossum gets to skip whiteboarding"
Keep telling yourself that as you fix mindless bugs in some Advertising platform lol.
Oh so that's why the Azure Portal UI is such garbage. Their frontend developers are just busy solving knapsack problems...
Senior engineers in such companies need to work and cooperate with hundreds of people. If they find solving such problems beneath them, or expect to be treated as a higher class of person, or not willing to get hands dirty, they will not be as valuable as employees. (Occasionally, the lone genius is great, but the lone genius is a worse employee than the genius that can cooperate well)
My company would keep doing such interviews, but the expectations change of course. A new grad needs to do these well. More senior people can do worse, and make up for it using other skills showcased in other interviews, or based on their record.
But if you find a senior person that finds solving algorithmic questions is beneath them, you might want to be careful about them and how they will interact with your company’s culture.
I mean, it's OK to ask for basic algorithms in interviews, to see if the interviewee has at least some understanding of basic stuff and/or can think on their feet and/or can reason about problems appropriately...
But I would still welcome it if instead of giving an interviewee a boring, memorizable problem like "invert a binary tree", the interviewer would find a more general problem and would see how the employee would tackle it, and if the interviewee refers to binary trees as part of the solution without writing out a full implementation from memory that's OK (as long as binary trees would be a valid approach to solve the problem, of course).
those are the best interviews imho. specially when both the candidate and the interviewer engage into a productive discussion about the solution the candidate gave.
at the same time, those take time and a lot of companies want a "fast" hiring pipeline, which leads to "invert a binary tree on this whiteboard!".
I see a bunch of comments that look to me as strawman, or really bad interview experience.
A good coding interview should: - not be known by the interviewee if they spent even a few weeks on leetcode - avoid requiring anything that isn’t covered in an average CS101 class - draw its challenges from the need to process a new problem, and gradually uncover the edge cases in it and how to handle them gracefully.
I don’t do leetcode. But went now and tried the first hard question I found. It was “find the median of two sorted arrays”. I find this question to be a good example of very little background knowledge needed. (You’d need to know how to deal with arrays, and what’s a median - not everyone will know these, but it’s a pretty low bar)
This question already has plenty of room for mistakes, edge cases and problem solving. I’m going to take a wild guess from knowing talented veteran engineers I’ve seen that they can surely handle it in the interview structures I’ve experienced.
I don't know any product that's pleasant to use that was developed in the way you describe. Python certainly wasn't.
If you tried to implement those algorithms on my team without a very good reason, there would definitely be some serious conversations that followed.
In any case, vomiting algorithms on command doesn't seem to correlate strongly to programming ability. Almost all programming problems have a lot more to do with handling much higher-level complexity issues. The knowledge and art of knowing how to poke some undocumented third-party API to implement our system is much more practical. Knowing how to think at a high level is much more practical. Leave algorithm questions for research positions in that area.
It's so ridiculous to see these replies. So Microsoft should've sent Guido van Rossum a note saying, hey study algorithm/DS for at least a month and do 100 leetcode before you come talk to us or it's a waste of time, thanks, bye.
Discussions of the industry tech interview process are now poisoned by these factors:
* There is an entire industry built around tech interview prep now (books, websites, practice/mock interviews). Many would defend this practice because their paycheck directly depends on it.
* Many see this as a hazing ritual that protects their high compensation and often their egos as well. These people are often young and will eventually see how harmful these interviews are when they get older and need to switch jobs. But by then there will be a new generation of young engineers defending the practice.
Or you know... an algorithm and data structures class that's part of a serious Engineering/CS curriculum.
If someone knows he's interviewing at a place where there will be a coding interview, he would be crazy not to take a look at his algorithm textbook.
And maybe if the course only only gave the candidate a passing familiarity it wasn't thorough enough?
A reasonable interview prep cycle would be closer to 200 practice problems, under time pressure.
Why? what's wrong with going "purely" into interview?
Good luck remembering the kind of details a typical interview asks for 10 years into the business.
Google bureaucracy expected from Ken Thompson (!) to pass a C language exam (!!).
https://www.theregister.co.uk/2010/04/21/ken_thompson_take_o...
"So Mr Thompson, you say you have some programming skills"
From what I understand it is like a "driving license" for each language - if you haven't passed the driving test you can still drive but you need to have an instructor keep an eye on you. If you haven't passed the coding test you need someone to review your code before submitting.
I'd say it's about doing the work for which he came there, from TFA:
"Google hired Thompson to create a new language, Go. But Google also requires all of its recruits to pass a language test. According to Thompson, he hasn't quite got round to it yet - and so can't submit code."
And no, I have no understanding for that utter stupidity, or any attempt to accept it.
Code committed to the internal repo requires a review from someone certified familiar with that language's internal style guide.
He was hired to work on Go, not C, and just didn't get around to writing enough C to bother getting that certification. He can write C whenever he wants to, just like literally every other engineer, he would just get a style guide review at review time.
"Google hired Thompson to create a new language, Go. But Google also requires all of its recruits to pass a language test. According to Thompson, he hasn't quite got round to it yet - and so can't submit code."
It's not and it wasn't about any C++ "certifications." He was involved in the creation of a new language. For the new language there could have not been any existing certification. And as far as I know, the initial implementation language of Go was not C++ but C. In creation of which was Thompson also directly involved. And as far as I know the people worked on the parts of the code before Google and these parts of said C code already existed before Google (Go had some dependencies on code from https://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs and https://en.wikipedia.org/wiki/Inferno_(operating_system)).
So it was indeed as absurd as it could have been. He was a part of the team that directly invented both the language and the style guide of the language, but some bureaucratic exam was expected from him to submit the code to the source control system.
I don't know how they managed to get that statement, but it's misleading. Many misconceptions begin with an element of truth. I'm guessing the element of truth here was the "certification" process. (Maybe it was something else, like a mixup having him as an advisor accidentally caused him to not be hired into the engineering group and thus there was a wait before he got engineering credentials to view/edit code. But that kind of thing is just silly paperwork and clearly fixed promptly.)
I just checked. He had literally written some C++ code before that snippet was published.
It was not the absurd statement it's been made out to be. It sounds unbelievable for a reason: It is unbelievable because it didn't happen.
Your failure to even recognize all that (instead mentioning "C++" and "certification" which is not the same) and to address the fact that these circumstances completely differ from your own much more narrow experience with established practices when checking in C++ code for which the bureaucratic rules already existed simply doesn't tell me that you can be believed regarding organization's capability to not react bureaucratically. Which is what Thompson apparently said and I still find, as I explain, very believable.
That is how I searched in the responses for any claim which would directly support your opinion, and still haven't found it.
I have no problem to admit I was wrong, but I'd really like to see some direct proof. Like somebody investigating what actually happened there and getting some first hand account. Not the talk about "C++" and existing rules for that (for which there is up to now a confirmation of strong enforcement, not tolerance).
But ken was at Google a long time before the Go project started. (The Go project was not developed in Google's monorepo and was not subject to Google's readabiliy process, as is the case for many Google projects.) What ken was referring to was indeed the C++ Readability process (which doesn't stop anyone committing code, just requires a review from a person with the 'readability' certification before committing; as mentioned upthread). I know this from talking to him about it, specifically.
I can't offer you any more proof other than the fact that I was a witness. If you don't believe that, then I'm sorry? Not sure what else to tell you.
FWIW your conduct in this thread is extremely obnoxious. I'm sure you'll find a way to debate that, too, but please consider that I have no vested interest in telling you this other than hoping you might better learn how your conduct is perceived by others.
Perfect! So what's the exact story, then, finally?
1) Was the quote from him completely invented?
2) Was he allowed to check in or not? Did he need the test to check in at that moment to which the quote refers? (I don't care about the moment when it was published).
3) And even more specifically: were there ever the times where he was in Google but when he not able to check in the code lacking some Google-prescribed "test"?
Just "yes", "no" or "I don't know" there, please. Also (just for my curiosity):
4) How long that period lasted?
Then you can elaborate where I was wrong by searching thorough what I've written -- I've specifically quoted the article and talked about his C background and involvement in a new language, never claimed anything about his C++ code and a "certification." I have an impression that your perception of what I've written and that, what I actually have written don't match.
If that's what you read out of the post, when I literally said the opposite, I can't reason with you.
The philosophy is that all Google code base should look like it was written by 1 person. It's great actually in practice: code in a big company should be hard to write and easy to read, as it's read by many people.
> The philosophy is that all Google code base should look like it was written by 1 person.
But all google products look like they are written by only one person so the aim is achieved. The worst thing however is that other person started doing the same.
That said, I would not be surprised this would happen at Google as they truly believe their process is vastly superior, as they believe themselves.
Pretty sure they would ask Linus to to a C programming test as well, and score him badly because he can't remember the exact details of some algorithm he has not used since he wrote the first lines of Linux.
He could probably get around this easily if he tried
Still a funny quip though
"Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off" [0]
More details two years later here [1].
[0]: https://twitter.com/mxcl/status/608682016205344768
[1]: https://www.quora.com/Whats-the-logic-behind-Google-rejectin...
We use shitty algorithmic questions as a proxy for answering the above question (in the vast majority of cases).
The companies that popularized this were and still are EXTREMELY lucrative, and get a TON of competition.
They can afford to be choosey. So they can try to find not only the person who can do the job but also do it BEST.
And that's really hard to tell from just looking at their work experience. You want to see how their brain works under pressure, dealing with an ambiguous new problem they've never seen before.
A lot of people who rag on modern tech interviewing don't get this. Unfortunately, so do a lot of people DOING these modern tech interviews. "He said the algorithm was O(n log n) but the answer is actually O (k log n). Not inclined"
And so, we spiral.
Selecting people based on how well they can code some linked-list traversal, in a web editor, while someone is timing them is not a good metric for overall "best". In fact you might reject candidates that think more about larger design problems, and overall your code might suffer.
This is the part I dislike the most. They usually disable copy-pasting too because they know it's that easy to google so you can't just code in your IDE and paste.
At some point it's all just signaling and wild guesses.
It'd actually be really, really cool if more than few people of Guido/Linus/etc's calibre did go in for some of the whiteboarding interviews (under an anonymous resume of course).
As both of them explicitly acknowledge - they don't (or no longer) consider themselves as top notch "coders" as such. Linus has said something like "I'm not even a programmer anymore" recently. And Guido said something like "I'm not the best Python coder by far - on a scale of 1-10 I'd say I'm at most a 6". Not because they're lousy coders of course. Just that (in recent years) they've had far, far, far bigger fish to fry.
So they go in, and "fail" the contrived Sudoku / Knapsack / "build me an Instagram clone, please" problem... then get strung along and gaslit for a while, before receiving an email 6 weeks later tell them that they're "not a fit".
That would be lots, and lots of fun to see.
I'd imagine no matter the problem he would breeze through an interview and leave the interviewer with some enlightenment on programming. It wasn't necessarily about whether the code was "correct". I remember once interviewing a ~20-year old for the summer program who when I gave him a problem he started talking about some linear algebra and geometry that I didn't even know were relevant but quickly made sense to me. But he was so humble about it, and looking to me like he wasn't sure if it was the right approach to take (It was hard to keep a poker face and not give away that he was a "definite hire" after about 5 minutes). His 5-liner to solve it had one bug but he clearly "passed" with flying colors. Unfortunately for us he ended up joining a startup in SV (and now is doing big things there).
(Runs for cover)
Well, after seeing what happened to Leslie Lamport, i don't have high expectations.
We just need some PHP, Rust and Swift magic to complete the picture."
Who is next? Ryan Dahl? Rob Pike? Larry Wall? Rich Hickey? DHH?
Craigslist is still web 1.0 no?
Aside from that, Microsoft also owns the VSCode extension for Go, so there's that team, as well.
After a few years of competition, they can just shut down the teams working with the least effective languages.
Using this methodology, Microsoft will end up using the best tools for the job. And they can accept people from any subculture for a few years while the experiment is going on!
This is the "developers developers develop" we have all been waiting for!
They want a golden path from their developer-facing tools (TypeScript, VS Code, C#) to their monthly services (GitHub, Azure, Teams). They're going to make all of that work together as well as they can so you won't want to look elsewhere.
Frankly, it's ingenious. If it works, the hard-to-monetize value of open-source projects like TypeScript and VS Code will be captured in your monthly Azure bill.
https://marketplace.visualstudio.com/search?target=VSCode&ca...
(full disclosure: I'm one of the people working on that)
I wouldn't be surprised if they've already roadmapped to end open source development on vscode in 2025-2030. The extensions are already proprietary.
But as far as Java, JavaScript and C++, I am not who the luminaries are, that work at Microsoft. James Gosling and Stroustrup don't work for Microsoft.
For example Brett Cannon is also at MSFT, he is a core developer and member of steering council for Python, he also qualifies along Guido for this claim in Python.
Now that Microsoft Edge is powered by Chromium, there are many folks that also contribute/ have say in development of chromium and nodejs.
This is just a rumour, but Microsoft aggressively hired Chromium devs from Google.
Basically Microsoft wants to build the best tooling for the most popular languages. They have Github + VSCode. Who knows they may also acquire stackoverflow. It's in their realm.
If that is true, why don’t they buy out JetBrains?
Or maybe JetBrains is just not available for them. There can be something going on between JetBrains and Google considering Google decided to partner with them on the Android development tools.
Or maybe Microsoft feels they are doing well enough with their current tools. You can't really fit the JetBrains nicely to the "big picture". Microsoft needs VScode, because they want IDE running inside browser. They also need the big old Visual Studio. JetBrains tools could not replace anything, but they would be a third pillar.
It is their right, of course. But I don’t buy the “new Microsoft” ethos.
The monopolistic DNA still runs strong in Microsoft. They are behaving nicely only where they have no advantage.
I don’t buy the “new Microsoft”, not one bit.
Having said that, aside from the pdf glitch I'd say it works very smoothly, exactly the way they intended.
But yeah, it does have a nice streamlined feel to it that I apprecitate (way better than the default Ubuntu interface IMO) except for the obviously hostile aspects. And the streamlined feel does really enhance the feel of how intentional many of those hostile aspects are.
Narrative tropes demand that there be a protagonist, so one of the bad guys must be cast as an anti-hero, at the very least.
Huh. I just realized that to many of his supporters, Trump is an anti-hero. No wonder pointing out his flaws doesn't work.
I am not saying Microsoft is exceptionally bad in any way. I am just saying the “new, good Microsoft” is a mirage. They are as bad as they had ever been, except they have been beaten into submission in some sectors, so they behave in those.
And yes, Apple making their device impossible to repair is evil, but their value extraction is opt-in (buy buying into their ecosystem) because they are not a monopoly.
(The kind of monopoly Apple has on the appstore, much like the Sony monopoly on the playstation, and Microsoft on the Xbox, is not AFAIK an antitrust target because non of them command a significant part of a market without alternatives; whereas Windows on a PC was an antitrust target because it does have that hold on a market, AND microsoft abused it to enter other markets).
w.r.t google, it seems like Apple is the lesser evil - as far as I (and anyone I know) can tell, if you turn off location tracking, it actually stays off.
But there is definitely no "good guy" among the big player. Right now, Pine64 and Puri.sm are the only not-yet-proven-evil guys around, and they are both minuscule.
This often leads to absurd decision making or false incentives. Things like the GUI shifting around making people click the wrong button by accident will increase engagement metrics and look like a positive thing in the reports.
Take Netflix as an example. If you set your UI language to English and live in Australia, Netflix allows you to choose only five languages:
- English for the hearing impaired
- Italian
- Simplified Chinese
- Traditional Chinese
- Vietnamese
Note that that list is for a show that has alternate audio languages like French and Italian, but you can't select all of those languages for subtitles. But here's the thing: Netflix has the subtitles in about 100 languages for every show. They just refuse to let you select them.
My parents are immigrants and like to listen to shows in English but have subtitles in their native language as a fallback. Netflix says "no". My partner is an immigrant and she's not Italian, Chinese, or Vietnamese. Netflix says her language just doesn't matter enough to make the list. I sometimes like subtitles, but I hate the hearing-impared subtitles. I don't matter either.
What's happened is that some overpaid statistician at Netflix figured out the top 5 most common languages for each region, decided that 99% coverage is "good enough", patted himself on the back, and the 1% can get fucked.
That statistician is probably paid 3-5x as much as me, and his job doesn't even need to exist. Just show every subtitle language available! Easy! No need to pay some "smarter than you" person to decide what you can and can't have.
Notes:
Apple TV shows every subtitle language, so there can't be any arguments saying that this is impossible or difficult or whatever.
If you call Netflix support, they will gaslight you and say that this is a copyright issue. It isn't, Netflix hides subtitles even for shows they produce themselves.
It's possible to do some combinations in any region. E.g.: setting the UI language to something other than English will make other subtitle languages show up. Some combinations are impossible though. So if there's some random couple like an Italian guy with a Filipino girlfriend, they can't do Italian language audio and Tagalog subtitles ever. Netflix has decided that their relationship is statistically unlikely and excluded them as outliers.
This. Just look at gaming. Xbox is losing, so they champion pro-consumer cross-platform multiplayer. Minecraft is popular, so they kill GNU/Linux support with Bedrock Edition.
> hijacked the PDF association
Alternative: The person has an in-built PDF viewer without scouring the web for "PDF viewer" and downloading malware or a sketchy app
> used credentials stored in Office to log in to Microsoft.com “for convenience” without asking
Alternative: "Wow it's cool how all my Microsoft things are working well together"
I think there's room for grace about the experience of 99% of users who don't want infinite customization but something that works well with helpful defaults.
There is no excuse to replacing that on a forced update without notification.
Seriously, you can explain anything this way: “all files deleted” alternative: “Microsoft just helping you free up space” or “the files weren’t backed up so they weren’t important”.
Microsoft is squarely in the “monopolistic bad guy” corner here.
Edit: Said person also had a self-updating Chrome, self-updating Firefox, and manually updating Safari on the same machine, for the record.
Maybe MS could catch the wave of "old-school" versions that are all the rage (e.g. WoW, Runescape), and release a Win95 flavour of Windows that runs on current hardware.
I miss the "old-school" GUI conventions and simplicity of - gulp - 25 years ago.
F# is public relations and research - so you get to enjoy the fruits. But the day it gains any strategic importance, it will be used and abused for that purpose.
Second, putting the icon everywhere in your face is monopolistic behaviour. In Europe, for a while, Windows came without a browser installed, and let you pick one to download upon install. This is the non-monopolist way to make sure the user has a usable browser.
Also, that user already had a self-updating Firefox, self-updating Chrome, and manually-updating Safari on the same machine.
No. You should be able to uninstall everything that isn't needed for the computer to boot.
Windows 10 should have been so much more and so much easier for Microsoft to rapidly evolve in a more beautiful fashion. But I guess there's just so much enforced backwards compatibility within it that their hands are almost tied behind their backs. Everything is ran in the same system on equal footing, from Windows XP era stuff to whatever the latest "app" trends are. Unsurprisingly it becomes a mess.
Windows 10X looked to be the right way forward where they finally decide to just run everything Win32 in light weight containers to shed all that dead weight for a more maintainable system, but it's sure taking a while to see anything and I hear the ARM edition that will be essential isn't going all too well. We're looking at a completely different, really troublesome, performance in 10X for x86 on ARM than macOS Big Sur and Rosetta 2 on Apple M1 that is already about to ship/shipping.
My biggest problems with Win10 are far more mundane - the incomplete/buggy touch interface, the explorer bugs that are old enough to drink, the new signed-executable security model that is very OSS-hostile (but again, imported from mobile OSes). The fact that half the configuration screens are in the new Settings system and half are in the old Control Panel, where you'll even bounce back and forth to tweak a single component.
Not cutting them any slack.
UWP is wonderful too.
https://www.howtogeek.com/442609/confirmed-windows-10-setup-...
The unattended setup on Windows is very confusing, there are like 3 different ways and 6 steps to configure, and the tools are mostly designed with GUI in mind. Could you imagine being able to configure, install drivers and apps using a single YAML file for Windows?
They're making it more obscure, though
Ironically, I installed Win10 coming from Manjaro, which even on a T480s (probably one of the laptops to have for Linux compatibility) broke after every other update, so like twice a day. On the other hand, Debian/Ubuntu has been too far behind on software versions for me. Both had terrible compatibility with my Thunderbolt 3 dock. Hopefully in the future, we will meet again!
Until then, it is ridiculous how much more Win10 Just Works.
Fedora/openSuSE are RPM-based distros while Ubuntu uses Debian packages.
This isn't at all true. Accounts > Family & other users > Add someone else to this PC. Took me 20 seconds to find this setting.
I feel like if I reached the FIRE point, I would continue to work, but entirely on my own terms, not as an employee of somebody else. Even at my favorite jobs, where I got to spend the majority of my time doing interesting things, having to deal with red tape, institutional slowness, upper management, etc. was not fun, and I can't imagine it getting any better when you know you are now working only because it's your hobby.
I'm later in my career, don't need the job for $$ (they know it), lead a great team, work on a meaningful project that I pitched in an area where I'm an expert, great support from management. The only thing remotely close to "red tape and institutional slowness" is about making sure what we build meets the promises (privacy and compliance, for example) that we've made to customers.
ADDED: As Denvercoder9 writes, some companies/groups can be pretty good about being hands-off a senior person who they want and also know doesn't need the job. Others, of course, are not. Certainly many Sun folks did not sit well with Oracle.
I'm right there with you - this is my number one goal for FIRE, is basically to not have to put up with anyone else's idiosyncrasies but my own. The only way I could see that changing is if I see a group of people worth working with, or a project worthwhile enough to work with other people, or I would feel an obligation to be a mentor to others.
I'm convinced the worst thing we do to our kids is shove them through school and stick them behind a desk the day they're done. I didn't break into tech until my mid 30s, but for the folks who came out of college doing this, you have a legitimate shot to be set before you turn 40. That said, if I could rewind, I'd happily push my own retirement goals back a few more years in exchange for a financially secure year off in my 20's or early 30's.
That said, although I didn't take extended time off, I did always max out my vacation time and took month-long trips to places like Nepal.
It was totally worth it.
In the end, it's a personal decision. I do agree that if you find the majority of weeks to be acutely miserable, then you should honestly ask yourself if you're giving up too much present for an uncertain future.
I'm also in my early 40's. I've been working nearly 20 years, I'm just looking at another 10 years in this job, and I don't think I can take it. The being stuck behind a desk for a majority of my waking hours during my 20's and 30's definitely resonates, and despite my passion for software, I (relatively) recently re-learned just how good physical exertion feels.
So yeah, I cut back on a number of things to reduce my monthly burn rate, but I'm not suffering by any means. If anything, I'm happier now with less, and seriously considering if I need to continue working, or maybe I can coastFIRE. The possibility has not escaped me that maybe it's just not the right job for me, and perhaps I'd be better off consulting or even trying micropreneurship, but on a more relaxed schedule.
I do wish that when I was laid off in 2001 (my early 20's) I had hiked the PCT instead of trying to start a consulting business. Burned through my savings, and I probably would have just as much money at the end of the PCT through-hike, and definitely been happier.
This is a rational position for folks like us who a) work to live, and b) probably haven't built anything to the level of the second most popular language in the world.
Now say you're Guido. I don't know him, but I feel like we're on a first name basis. Guido is clearly driven to invent, and has developed one of the major building blocks of modern tech. He's probably set for life financially, but Guido has the urge to innovate. Along comes Microsoft, who basically is paying him to do whatever he wants, however he wants. If you're Guido, you take that.
Now if you're me (and it sounds like probably you too), we don't have those kinds of offers, and I personally don't have that specific drive either. Ideal retirement for me is more time in my yard and also probably spending the cold months starting app projects that I'll never finish. The way life should be!
If you want do to something that impacts or depends on other people then it will never be solely on your own terms. Plenty of people burn out of OSS because they think otherwise and then the angry users eat away at them. Likewise being FIRE doesn't mean you have unlimited resources so if you want more resource you will need to get them on someone else's terms.
I've known a number of senior people at these companies that basically get to do whatever they want, pitch projects and then have teams whose job is to work out the details. Their name provides so much political clout that the org bends around them rather than the other way around.
Personally I work at startups as a hands on manager so generally haven't had much red tape, institutional slowness, upper management, etc. hassles to deal with. Would continue doing so if I reached FIRE although might cut down my hours.
I still remember the first O'Reily pink Python book waiting on my desk back then when I joined.
OTOH, there is no much benefit today in Clojure over other languages for database backed apps, most of what is considered good Clojure code is more about the methodology than the language per se. The real benefits IMO is when you paired it with Datomic avoiding the impedance mismatch in data structures, but Datomic is another can of worms.
They let Anders Hejlsberg have free reign over his languages, encouraged it in fact.
He joined them in 1996, and has done J++, C# and now TypeScript. They seem quite content for him to just keep making new languages which they throw all their marketing muscle behind.
Me, some rando MS employee who works on languages: yeah, I can actually do pretty much anything that I feel is right, at half the level of Guido (if even that) and a miniscule amount of clout
At least in my group our ability to do what we want was directly corresponding how connected/influential our sponsor was, and absent that, I have almost no ability to do what I feel is right, even if I have data backing it up, if the powers that be are in opposition.
I don't want to paint this as some universal ms-doing-terrible-things statement, just that I don't personally feel like I have much freedom to assert philosophy or ideology, and I've seen well respected individuals in engineering even up to and above principal/partner die on comparatively minor hills before which makes me think it's not just me.
And while I'm being dangerously candid, this to me seems like a prestige hire much like carmack at facebook, and I chuckle at the ado being given in both directions in this thread. I will be pleasantly surprised if this motivates more python support but expect neither good nor bad.
Makes you think about how important the syntax for a language is.
To a seasoned programmer it may look obvious, but Python is still by far the best language for newcomers, and generally people tend to stick much longer to the language they were first taught.
I think that saying Guido has taste implies that Python is tasteful.
Yes. Obviously people have different tastes, but many many people find Python to be tastefully designed.
> It basically ignored Scheme, ML, and Erlang dialects from its creation onwards.
Those are... all radically different languages from each other.
This is like arguing that a peanut butter and jelly sandwich would be better if it was more like sushi, chocolate, and pasta.
Not really, but that wasn't my point. My point was, that at the time of Python's creation, all those languages existed and have taste. The fact that they were ignored in Python's development is an example of it not having taste.
The best example of this is Python's scoping rules. When something like Scheme or ML exists and you end up with Python's scoping, it's hard for me to understand where the taste is.
It objectively has ignored features from those languages, such as immutability, concurrency, sane scoping, functional ways of thinking, pattern matching, better REPL, etc. which have all been making their way into most modern languages. So what’s tasteful about Python? The benefits it has that I see are that it’s easy to download and run for simple scripts and has clean-ish syntax, but that’s about it. For anything larger, it quickly gets in the way.
Popularity is a confusing beast. What has made Python popular, in my opinion, is that it was adopted by scientists, but in my experience, that group of people has little taste in software and little want to figure out what else is out there.
You say that like that doesn't count for a lot.
The ease of getting Python to do various small bits of automation is the main reason I use it.
And those things aren’t enough to justify building large software out of.
My favorite example here is that in a function definition, `def foo(): \n pass`, the `:` isn't needed, a machine can parse it with only the newline. The : is a requirement because it made it easier for humans to read the language in user tests.
I would recommend at least checking out Racket and giving it a chance if you've never even heard of Scheme. If you like Python's syntax, then you might be interested in the Rhombus project that the Racket team is embarking on or Pyret, both of which have Python-esque syntax. I'd also recommend F#, which has just as clean, if not cleaner syntax than Python.
It's hard to call Python's syntax perfection when it is missing piping and pattern matching. Python can't even do multiline method chaining without an extraneous "\" character or parentheses. Python also doesn't have a multiline comment syntax.
Doesn’t mean I dislike functional languages either. I just specifically found the parentheses more annoying than clarifying.
Scheme is a better comparison, but its lexical scoping requires all local variables to be explicitly declared. You can argue that it's a feature, but that's rather subjective - and if somebody wants the simplicity of assignment-is-local-declaration, how exactly would you do it differently than Python?
https://en.wikipedia.org/wiki/Amoeba_distributed_operating_s...
I think it would have seemed out-of-scope to include too many sophisticated features. Also GvR was young, he might not have had [enough] exposure to all those languages, eh?
Anyway, congrats to both MS and Anders! This will be very interesting for Python.
That already exists, and van Rossum worked on it: http://mypy-lang.org/
EDIT: As mentioned below, also added Pyright [2] by Microsoft
[0] https://github.com/facebook/pyre-check
Joking aside, my question centered around that if one wants a type-safe Python, why wouldn't you just want something similar to F#?
That is unless we're talking about a gradual typing system for Python, where new Python code could be typed and integrated into untyped codebases, similar to Racket and Typed Racket.
You can also write type stubs for libraries that don't provide type information.
They are totally different, the core paradigm of programming is totally changed and most of the points of JS are not in Rust (meta-programming, garbage collection, community)
My wife used to work at Dropbox when Guido worked there. Apparently he was quite active on the company-wide mailing lists, even talking about mundane things like the food or parking.
So MSFT employees you may get a chance to chat with Guido!
Interesting that mypy is a Dropbox (GvR’s previous gig) whereas Microsoft has a competitor python type checker, pyright [0]. Anyone have experience with it?
[0] `To run PyCharm Community Edition, please use the provided run configuration "PyCharm Community Edition"`
Reason is MS doesn’t need to make money on the tool, because it has a halo of services it can sell in and offer perfect integrations for.
In addition, MS has GitHub and thus privledged ability to learn from new public code as it is pushed.
AI-based code completion offered by kite and tabnine is totally being slept on right now, and MS has the resources to offer a very refined and constantly improving take on this massive dev services opportunity.
Jetbrains has said it has a long term project focused on this but as of now there is nothing.
I am not suggesting abandoning Pycharm any time soon but it is going to take a bigger company than jetbrains to keep pycharm in the race against vscode.
The fix is in because vscode itself will be forkable at any time. It will just be that _services_ from microsoft and other companies will be designed for the tool.
For example, this AI code completion behavior. I can say right now that if tabnine had a version working in Pycharm that did not break autoimports, I would already be paying a monthly subscription for it. Jetbrains should be offering something similar ASAP.
Another example would be PaaS for frameworks using Azure. Start a project, choose a domain name, instant staging and production deployments.
Anyone could build these kinds of plugins to sell in services. It will really be about who does it best. Though, I think Microsoft is specifically positioning itself for a long term play here and I think much of it centers around vscode.
Deployment can easily be done with a script from the terminal, which doesn't need special IDE integration. "Starting a project" doesn't need any tools at all in simple cases - one could try to keep cases simple.
Python usually has less need for auto-imports than Java does because APIs are simpler, names shorter and modules more coarse-grained.
You might not need an IDE and an AI with simple tools. Of course, some problems require or benefit from complicated magic tools, but perhaps not all problems do.
But setting that up securely in of itself was a lot of work.
On my new project I deploy by pushing to staging or master. These deploys are blocked if the commit under inspection does not pass tests.
That all happens because of docker containers and GitHub actions and secrets. There is an enormous amount of magic behind this stuff but I would not go back to provisioning and maintaining my own boxes.
I do think there is a lot of benefit to gain from having services built directly into the IDE.
For small projects, a text editor will do. Though linting and code formatting helps beginners and pros alike.
It only takes a moderate amount of resources to collect this for yourself.
But also to crawl and process the entire dataset including issues constantly.
It’s conceivable vscode could highlight and warn about known issues in packages as new code is developed.
I wonder if Guido will be ok with that. For me pylance looks like the biggest evidence that embrace-extend-extingish mindset is still alive in Microsoft, unfortunately.
Not really "instead of", since pyright is the typing engine for pylance.
I'd be thrilled if Guido and Microsoft could help make this better!
If non-programmers don't even want to run a few command in terminal like pip, why do they even want to start with python? The whole mentality is wrong.
My aim is to get them to a state where they have a recent Python 3 on their path and they can create virtual environments for their projects which work in a predictable fashion.
Inevitably they have already tried several different ways of installing Python and their system looks like this XKCD: https://xkcd.com/1987/
As for installing apps written in Python - that's really down to the developer. A desktop app would normally just bundle Python for its own local use, similar to what Java apps do, and users are none the wiser - to them, it's just another installer. Some examples of such software on Windows include Calibre and CHIRP.
I've been working with Python for nearly twenty years and I find the idea of bundling Python with my application daunting. I want it to be easy.
But I agree, it's a slog to set up everything on a computer, if you wish to install Python from scratch, along with some IDE.
Sorry, throwaway account! Apparently I was the one who was wrong!
I tried to convince Guido to do a P# April Fool's (I think in 2005 or 2006), but he disliked the idea so much I didn't do it myself either.
It has transformed since into: https://microsoft.github.io/coyote/
I could only find "Office Scripts", which doesn't work in the normal desktop apps (only the web version).
Edit: I just found out about "Script Lab". Is that what you are talking about? https://appsource.microsoft.com/en-us/product/office/WA10438...
The finance folks I work with are fucking wizards. I'm convinced many of them would have made great engineers given what they can accomplish building applications in what might be the world's worst IDE.
I'd say two things would make it better: - Have a "code" version of the cell editor that has formatting/indentation + basic linting. [Sometimes 75% of the challenge is reading the code in linear fashion and figuring out what it does]
- Integrate git-like versioning and some sharing features with Office365. Basically, make it so that you can roll-forward or roll-back on both the code and the contents, and make it so that you are _not_ emailing files around to share them.
It was one of my first usages of Python, and used that to create quite complex Spreadsheets
They did officially respond in 2018 and put out a survey for thoughts, don't think they've followed up since but they definitely know demand is there.
He must have no imagination. When I had a day job at a big company, I would start working on open source in the afternoon as soon as I got home from work then I would stay up late working on it. The next day I would be tired and depressed that I would have to go to the office to work on some useless product and could not wait to go back home to continue the real work.
Speaking of Python in particular, there are people at Microsoft who get paid for, among other things, working on Python itself.
All CPython alternatives stall do due to the widely used C API (required for NumPy, TensorFlow, etc). This API is very CPython specific.
There is some work on both sides, that might overcome the issue though: CPython is trying to decouple API from the implementation details, while .NET is working on better C interop story (.NET 5 just introduced ability to export managed functions as C functions).
Care to explain what's worrying you though?
There was also IronPython added when the DLR came out and is still updated to this day, latest works in .NET Core. [2]
It would be fun for Python to have more focus with Microsoft tools and some things on Azure or even another Boo/IronPython like CLR/DLR virtual machine language or more focus on IronPython itself as well as more of CPython. Having Guido at Microsoft is awesome.
[1] https://en.wikipedia.org/wiki/Boo_(programming_language)
Besides, while you lose out on Python's native ecosystem you gain access to all of .net's.
Full disclosure, I'm one of the <many> maintainers working on a subset of the Azure Python SDK. Currently, there actually _is_ a large-scale rewrite in progress to bring the various SDKs up to a consistent level of quality and python standards, since it's no secret the original batch of SDKs grew rather organically. As such, this is a VERY APT time to hear this sort of comment. (And yes, I'm taking it totally deadpan even if it wasn't necessarily meant that way :P)
Do feel encouraged to file issues on the azure-sdk-for-python github as well as things come to mind; there are more formal triage processes there than "I happened to read this over lunch" :)
Disclaimer: some (or maybe all?) of the things I'm mentioning here might be caused by the API itself, rather than the SDK. The order is in which it comes to mind, rather than importance.
1. Some kind of strongly typed errors. I've turned the SDK upside down, and the only error that seems to pop up 90% of the time is CloudError with CloudError data. So our SaaS application (which utilizes Azure IaaS heavily) has a bunch of regexes that parse the messages contained in CloudError and throw something from our domain. Wrapping SDK errors by the implementing clients is a smart thing to do, but not this way :). Some messages change from time to time, so we try to make our regexes more tolerant, but you get the picture. In general the error handling is very strange, a lot of low-level errors sometimes flowing into high-level calls.
2. Documentation with more examples. The easiest thing to do is sometimes looking at the API or CLI documentation, and try replicating it with the SDK. Parameters named differently etc.
3. For some reason the Storage API/SDK keeps changing and it's like it's from another world than compute and network, which look pretty similar. The storage portion is... wild.
4. Improved working with data disks. Updating the VM with an array of disks has shown bad performance (and Azure support helped us and said that it can't be improved because it's a cross-RM event) but also poor reliability. A separate set of methods to attach/detach disks to VMs would be great.
5. Because we heavily rely on asynchronous operations, what we usually do is make a raw HTTP request for an operation (like VM deployment), serialize it and store it, then after some time deserialize it and check if the operation is done. We do the same with hundreds of requests at the same time, being able to process a lot of cloud operations with not much resources on our side :) . It works, but I found the raw request and serialization is a bit clunky. We're also stuck with a couple of older SDK libraries because we've noticed the raw responses changed in the newer ones, so now we need efforts to find all of the differences and consolidate the serialization. For example, the headers have had multiple urls to check the deployment status, sometimes it's `async-url`, sometimes `location-url` etc. This probably isn't something the SDK is to blame, and this is a niche case, but serializable async responses would be nice :D .
I have to commend the effort to break up the libraries from the original SDK into independent units. The versioning and dependency management became easier than with than one monolithic "4.0.0" schema.
Maybe some of the things are out of scope and our use-case is disproportionately affected by some stuff, it's just my two cents. I'm less satisfied with Azure as a service, with its unreliability, sub-par support, idiosyncrasies and poor "hypervisor" performance, than the SDK, but it's the SDK that gets all the blame because it's the one we're interfacing with.
I'm honestly appreciative that you'd give this long a response, I've unironically been sharing this with peers internally for what an interesting spread of feedback it gives. I have to give a similar disclaimer of "no promises" BUT...
1. 100% agreed with you. We're currently working through this discussion for ServiceBus, actually, it's VERY apt you mention this now, as we've been working with the architects and other-language SDK owners to find proper semantic unification between Python's inclination for more fine-grained strongly typed errors, vs. e.g. dotnet's inclination to have unified exception types and "code"/"reason" fields. Can only speak for the data plane SDKs here (vs. -mgmt, that's a different team) but our architects have within the last 2 days expressed their alignment with the pattern you're requesting. (We explicitly as a guideline want users to not have to rely on any ad-hoc string parsing to distinguish exceptions) We've also been attempting (to lead into #2) produce both better samples EXPLICITLY to show common failure modes and "best practice defensive coding", but also conceptual guidelines (e.g. here [0]).
2. Preaching to the choir. Samples are a First Class Entity for our Track2 APIs (complete with validation, smoke tests, etc), used not only as inlined samples in docstrings and refdocs, but as long-form examples of E2E scenarios as you suggest. (and for more esoteric subject matter that may not be covered in primary long-form docs)
3. I'm not 100% sure I'm thinking of the right component when you say Storage, do you mean e.g. `azure-storage-blob`? #4 implies you may mean more of the block storage/VM interconnect logic, and unfortunately I can't speak with deep familiarity surrounding that, other than to note that the ARM template parameters for configuring this hasn't always been "great" (e.g. I think I recall there being a need to format a disk as a separate step? not sure if this is the sort of thing you're referring to, half thinking out loud, but that's more distant from my area) Would be curious to know specifically which transition was painful though/what kept changing, since it is a "core awareness" going forward that migration pain is a Major Friction Point for users ("well duh" says every dev ever) so I'm just curious to see if your specific callout is something we'd have been aware of/can impact.
4. See the above re core surface area of "working with disk"; and to your later point some of this may be more service-side than SDK, but your mention about attach/detach disks is salient and something I can perhaps throw a shout at someone about.
5. To make sure I've understood, you're serializing like, metadata/a record of the long-running operation and doing it yourself? The track 2 APIs use something called a Long Running Operation poller internally to facilitate this sort of operation; now this may not solve your scenario depending on how your control flow gets passed off or not/your need for serialization, so this may not actually change anything tractably for you, but mentioning on the side in case. Curious re: what you mean by "is a bit clunky" though more precisely as well. And in terms of raw response consistency, yeah, that's not surprising, that's not one of the things I think we pin in backcompat (or even feasibly could, to your point, BUT we may be able to take more into account if there's any way to offer a continuous experience if this changes and folks were relying on it. Regardless it's something for me to keep in mind when doing design discussions with the service teams)
Glad the library fragmentation is well received. I'll candidly admit I was worried about that (was a user, not a maintainer when it happened, and did the normal grumpy-engineer thing of "they moved my cheese") but it does seem to have worked out nicely and given some good modularity.
Finally; Two cents, this was ten cents! I feel like I owe you big time for having given such a well-thought-out response. Thank you; sincerely, you didn't have to do this and have done us a big favor.
Absolutely get where you're coming from re: SDK being the public face, and that's what leads me to be eager to try and improve what we can. (And selfishly gotta make sure I can feel proud of the code that has my name attached to it :P ) I cannot tell you how much Reliability resonates with me. If nothing else, I can assure you this dev is in your corner; hardening, reliability, stability are the mantras within my purview. (signed, an-artist-formerly-known-as-SDET.)
[0] https://github.com/Azure/azure-sdk-for-python/tree/master/sd...
3. Correct, I'm referring to azure-storage-blob and azure-mgmt-storage. I'm not concerned with the unmanaged disks so much, which utilize the storage accounts (thank god, we're over that :D ), more with working with regular blobs. From the initialization of the BlobClient to the operations which are sometimes weird in their input parameters, it's not up to par with lets say azure-mgmt-compute.
4. This point is not related to point 3. I'm completely referring to managed data disks, which are first class* entity (like NIC, for example, not a Page Blob any more). Attaching them to an existing VM is a nightmare, and because of some features we do that often. Also they lack basic things like per-disk disaster recovery (but this is way out of the scope of the SDK).
5. Correct, we're doing it by ourself. The LROPoller is also there in other parts of the SDK, we also use (if it's the same poller), but I think we were not able to utilize it. Ny clunky, I meant the response itself sometimes has headers with redundant values, we're not sure which one to use so we just take from experience (if there are two similar) etc. I haven't looked at the docs recently, but the "raw" requests are not documented that well.
* - I did say that managed disks are a first class entity, but we found out the hard way that the managed disks and managed snapshots are actually just in some storage accounts on the backplane, and when something goes South, storage-level errors leak out to our logic :) . Also throttling, thresholds and quotas apply as if it were just another storage account, but even worse, we don't control how the disks are distributed between those backplane storage accounts, so we get funky issues from time to time. We solve them by being extra careful and conservative with some operations, but heh, talking about leaky abstractions. This is not an SDK thing, just wanted to point that out for someone reading.
And +100 on not having to manage quotas/storage accounts/figure out how many accounts I need to distribute disks across in order to avoid throttling. There are many things I'd rather do :).
And Bob Dylan?
Van Rossum is famous for the Python language and language-related stuff for Python, but he did stuff in his career before inventing it and has done stuff since (for instance, a lot of his work at Google was on App Engine).
There's a phrase you don't see every day.
It's confusing to me that Microsoft embarked on their Iron <x> project, or whatever it was called, to stress test the CLR, got F# out of the project, and then decided to sit on it. They have incorporated F# features into C#, but it is confusing to me that they saw the rising popularity of Python and decided to let it happen unchecked because C# will never be F# or a language that appeals to Python programmers.
Wow, really? I'm a big fan of Clojure and F#, but IDK, I think there is a bias against functional languages since they, IMO, are harder to start doing stuff.
Maybe? A likely first step would probably be something like an Electron fork/distro with Python built in, along the lines of the abandoned PythonWebkit: https://www.gnu.org/software/pythonwebkit/
The fault with Ruby is its less useful stb lib and lesser performances.
Plus everyone mostly indents the code the same as Python anyway... so. Meh.
In C++ I can write some janky looking code and autoformat it into respectability. I can stop caring about whitespace entirely (while still producing readable results).
In python I need to write correctly-indented code because the autoformatter can't figure out if the lack of indentation is meaningful or not.
The whitespace is part of the syntax. Just like in some languages putting a semicolon at the end is part of the syntax.
And for the most part, your IDE will take care of whitespace anyway.
"Something went wrong, but don’t fret — it’s not your fault."
Took me a moment to realize that statement wasn't in reference to the statement "Guido van Rossum joins Microsoft".
About $200k/yr+, it's a good idea to find a lawyer or similar talent agent to workout the compensation package because they have the skills and can get away with things a hire cannot. I've done this before, it saved time, and ended up with a better package.
I think he could command nearly $10 megabucks, give half of it away to charities, grants, scholarships, social ventures, and underserved areas to promote STEM college prep, and still have more money that one ostensibly average, middle-class person would know how to invest (real estate on the near periphery of burgeoning urban sprawl areas). Microsoft is a cash cow and is willing to invest in a solid, deep bench to stay competitive, especially in an apparent transition to either EEE or adopt OSS.
On a more serious note, I hope Van Rossum and Hejlsberg spend lots of quality time together and thoroughly pick each other's brains. This could result in great things in the programming language space.
I might need to branch out into other languages.
npm is trivial to replace with yarn and a custom registry.