I’m looking to put together a team in the next 6 -12 months to work on NLP/ CV stuff.
Would prefer to have everyone work in Julia, but I’m concerned about the overhead of doing so. What is the availability and cost premium of people that know Julia over say just C++ and Python? Can I have smart python people simply learn Julia?
Would be interested to hear from anyone with experience dealing with these issues.
Learning a language just requires mapping over abstractions to new syntax, and learning Julia just opens someone up to using more abstractions (i.e. you can write loops now!). Anyone who writes their own code (i.e. doesn’t just copy bits from StackOverflow) can switch languages quite easily. Honestly, if having to learn a new language scares away a programmer, were they ever strong enough to consider hiring in the first place? It might be a good sieve to scare away weak programmers.
(You might lose strong ML scientists which have weak programming skills, but their code would likely become a crutch sooner rather than later if you’re looking to deploy real software. I extrapolate that given the code I’ve seen from some fellow PhD students…)
If what you want to do can be build making some calls to high quality libraries already written in C++ maybe you might not even need Julia.
Any Python programmer can learn Julia. Any smart Python developer might do what you want with Python or Cython. If that is too much of a hassle then they might be interested to learn Julia. At least this is what hapened to me.
Just adding one more point, if the code you expect those programmers to write in Julia is big on performance, you might want to consider the time it takes to adapt to Julia enough to write high performance code. While it may take a Python programmer a day or so to pick up the basics of Julia, and a few days to go through the documentation, it took me a while to understand type stability and memory allocation gotchas. Maybe I wasn’t as good of a Python programmer as the ones you are planning to hire, but the above is still a valid point to consider regardless.
I think there is an abundance of smart people here, whether they are available for hire or not, that’s a different issue. So it might be worth advertising your positions in this community to invite applicants who already know Julia to apply for the job.
I have been using Julia since v0.2. I was a former C++/MATLAB programmer and It really took me 2 or 3 days to learn Julia at that time, when the documentation available was not that great. Today, a good programmer can learn Julia faster. But this is to write the first codes. Write fast code is another history. In this case, you will need a more deep understanding of the language.
However, what made me switch to Julia is that, after a learning curve, you can construct codes only a bit slower than C in a very smaller time. Moreover, it is much easier to support Julia code than C code. Hence, even if your new programmer do not have as much knowledge in Julia as in C, I think it is worthy to use this language for the projects in a long term, even if you can have a little more cost at the beginning.
Anyway, I am pretty sure you will not have problems to find good Julia programmers. The language is getting more popular everyday
I learned Julia myself back starting end of March 2015 (after decades of C, C++ experience, but I also knew Scheme, which IMO helps out a lot learning Julia). I agree completely with what Chris said. If you know the concepts, then learning a new language is easy (unfortunately too many courses care more about teaching only the syntax of a language and the concepts that are “easy” in that language).
In June 2015 I started mentoring a team of fresh hires in India in Julia, and each summer a new crop of recent graduates was hired, from 6-9 each time, mostly with some past C/C++ experience. Learning Julia wasn’t really a problem for them, the problem was more teaching them about the performance issues.
Some of them have even gone on to other companies, and got Julia to “metastasize” to their new company
This is off-topic, but i somehow list explicit loops as a form of missing abstractions; you tell the execution unit what you think it should do. An abstraction in this place would be: ‘process my selected elements with method Y’ which is in most cases an implicit loop.
Do i miss your point here?
The difference is that in python or matlab, you are limited to explicitly provided abstractions from libraries (written in C, mostly), or slow to a crawl. In julia, an explicit loop is just as fast as in C, and a user-written kernel (the process part you allude to) is just as fast as a library provided one.
Sometimes, an explicit loop, e.g. a while-loop, maybe even containing @goto, is really the correct level of abstraction for thinking about an algorithm. Sometimes, a user-defined function that is called often is the correct level of abstraction. Both are important tools that are missing in python and matlab, if you care about speed.
If you never need this, e.g. because all your time is spent doing GEMM in libraries, then you don’t gain anything over python+numpy.
But julia is much, much more convenient than writing your inner loops in C and using ctypes or python.h; it is imho even more convenient than cython. I don’t know how convenient the matlab-C interface is, so I can’t say how it compares.
To me explicit loops are not a missing abstraction, they are a fundamental construct to enforce going over elements in an specific order and do whatever you have inside the loop in an specific order. I think the point Chris is making is that you don’t have to do “hacks” to do trivial things in a performant way. Think about rudimentary snippets of code such as how would you change all elements of an array that are above a threshold value in python and julia. In python my solution would be to create a new array and compare it with the first to get my solution because I want to avoid a for loop. In Julia I would simply write a for loop and not allocate any memory.
Julia is starting to solve “the two language problem” but not the two “programmers problem”: Those who know how to analyze code in terms of memory and compute and those who don’t. I still can’t do it but at least the language gives me tools to try it If I need (or want) to do it.
If you feel there should be better ways to define operations than for loops I agree with you. But all alternatives I have seen are a work in progress that almost involves creating a new programming language such as https://github.com/facebookresearch/TensorComprehensions.
Maybe one day we will have a package that can go over your code and start changing the order of loops, unrolling loops and so on using the metaprograming capabilities of the language but, so far, I haven’t seen any library trying to do that.
The nice thing about Julia, is that via metaprogramming, you pretty much can create a new programming language for your particular use case, and if it’s of general interest, stick it in a package and let anybody take advantage of it.
No need to start from scratch!
Can you share more details about the project itself? “NLP/ CV stuff” is a very general description, thus it’s hard to suggest a good strategy for hiring devs.
For example, if you need to extract structured facts from natural text, Python’s spacy provides pretrained production-quality dependency parser, while the closest thing in Julia is JukaiNLP which haven’t seen any updates in the last year. If you need to find keypoints on a face, you can set up an example using C++'s dlib in an hour, but you’ll spend a month re-implementing it in Julia. And if you’re going to do some scientific stuff, it might be better to just hire very smart people and let them use whatever tools they like. I’m definitely not trying to discourage you from hiring Julia developers, but normally the task comes first, and the required resources (including developers and their skills) are selected for that task.
I think it would have been more appropriate to ask about the UPSIDE of hiring Julia programmers. It seems to me that many Julia programmers are quite experienced in multiple languages (Python, R, C++, and Matlab are often mentioned as background), so IMO here is a substantial strength compared to monolingual programmers.
The NLP thing will be custom simulators (using control flow, possibly structs ) and generative models with an abstract interface to be combined with off the shelf parsing, more conventional deep learning layers etc
This will be be dipping into ideas like differentiable programming with non differentiable components (instead of just using “Deep Learning” for NLP).
The CV(Computer Vision) aspect will be a more standard use of custom objects as layers, but still using parameterized custom array logic.
@PetrKryslUCSD That’s a good point. I’m aware of several other upsides as well.
@ChrisRackauckas and everyone else: Thanks, that is all encouraging. The performance constraints will hopefully become easier to navigate as the compiler and tooling gets better with 1.0, and given that, it sounds like not much overhead to switch people to Julia even if they have to write performance sensitive code.
Thanks for the response, it makes much more sense to me now. In fact, this is exactly kind of problems that brought me to Julia a long ago. I’d then look for Python devs with strong understanding of concepts underlying modern deep learning. Switching between languages should be the easiest part