1,735 karma · joined January 31, 2013
There are a few common issues: 1) You measure compilation plus execution instead of just execution. 2) Your code relies on global values that limit optimizations. 3) Your code doesn’t allow the compiler to determine all the types. 4) Your code forces allocations for intermediate values.
Especially 4) makes a big difference when you’re coming from NumPy or MATLAB. If you have a chain of vectorized operations (e.g. “X = α * A + β * B + γ * C”), the performance is quite similar between the languages, but in Julia you can enforce that these happen in-place with a single fused loop and zero allocations (e.g. adding “@.” in front). This can often give you another ~2x–10x speedup and make the difference between “similar to NumPy/MATLAB” and “similar to C/Fortran”.
[1]: https://support.signal.org/hc/en-us/articles/360007062012-Ne...
I start with what I am trying to achieve and list the different design approaches I can think of, adding advantages and disadvantages of each one as they come to mind. By the time I’ve written down all my thoughts on a design decision, it is often clear to me which approach I favor.
This can be repeated for more and more detailed aspects of the implementation (e.g. “which function should this be added to” or “what to name this function/struct/variable”) until I feel like I can come up with the remaining details as I’m writing the code. If I get stuck somewhere later on, I can always go back and add more details in the text document.
For larger or more important features, this list can be cleaned up and become documentation or perhaps a comment somewhere, but I often find that the writing is a useful tool to get unstuck and to clarify my thoughts even if I end up never reading it again.
I’m all for ambitious research projects pushing the boundaries of electric flight, and there’s probably reasonable use cases for planes like the X-57. But a sustainable urban transport future looks much more like buses and bicycles rather than small electric aircraft.
Everything I want from a reference manager can be done in a relatively simple command line tool with an interface similar to beets. Only the extraction of DOIs from PDFs looks like it will have to be a bit hacky, but if `ref im article.pdf` works for 90% of articles and asks me to provide the DOI for the other 10%, that’s good enough for me.
I do find NVC extremely helpful as a tool to understand communication and conflicts though. There are many great insights on how conflicts appear and how having an empathic understanding of each other can help resolve them.
I’m not sure whether following the steps outlined by the method helps with that though, especially if a person sees the method as a “turnkey solution” to get other people to “behave” rather than trying to do the introspection of why you are bothered by something and to separate what the other person did from how you feel about it.
https://www.republik.ch/2019/02/07/the-tricky-business-of-de...
That said, I still find it very much feels outdated as soon as you veer off its core features. Handling strings is a major pain, writing short functions feels overly verbose, and proper testing is difficult. The language is full of arcane details that require reading up on best practices even for simple things such as defining the precision of your numbers.
So while Fortran still is strong in some areas, I do see it as an outdated language, just one that doesn’t really have a good replacement yet. Hopefully Julia can replace it for most use cases, or maybe Rust if they figure out their HPC story.
[1] https://decorrespondent.nl/ [2] https://krautreporter.de/ [3] https://www.republik.ch/
Over the last years, I gave a lot of thought to the topic of conveying information. I see research as the process in which knowledge is created. This knowledge then has to be “encoded” in a format that allows for the transmission to other people. This encoding can be optimized in different ways. Research articles have the advantage that they are close to “lossless” in that they are supposed to contain all information necessary to build up that knowledge. This makes them well suited for archival, especially as they can be stored as a stack of paper.
However, research articles are often not optimized for building up that knowledge in an efficient way. I believe that the “encoding” optimized for learning & understanding should be more like a progressive image codec, in that it provides a comprehensive view as soon as possible, filling in further details along the way. This also makes it possible to stop whenever you have reached the level of detail that is relevant to you. The challenge in creating these encodings is to extract the information that provides the most clear & useful picture as soon as possible. I like the word “to distill” for that process, as it is really about extracting the essence of a body of information.
Doing this work for research articles is how I understand the goal of distill.pub, which seems extremely valuable to me. However, I think this is just the first step. What is the most useful distillation of all of deep neural networks? Of all of machine learning? Of all of computer science? As others mentioned, there are some forms of publications (review articles, textbooks) that do part of this distillation process, but they only cover part of the spectrum. Preciously few textbook contain a well thought-out summary of their contents and not just an introduction. In my experience, often the least amount of thought is given to the highest level of abstraction (e.g. what is the essence of mathematics?), even though they are the most fundamental ones.
It would be great if there was more focus on extracting useful understanding from the ocean of knowledge we already have (useful both in the sense of being applicable on its own as well as being a solid foundation to build more knowledge on). It looks like distill.pub is a step in that direction, and I really hope it will bring more attention and recognition to this kind of work.
I think I found an error in “The Lektor Device“: The “I“ in “WITH” could also be a “T” from the rules, but only the “I” is accepted.
* The CMS interface is very powerful, which can be a good thing in some cases, but for most sites I make it is more of a liability than an advantage. Users can easily format the headline red because they think it deserves more importance, they can add new layouts everywhere adding columns to pages etc. For pages that are carefully designed, this provides a lot of room for screwing up the site, both accidentally and on purpose.
* Due to the power of interface, it becomes a lot more complex than it should be. While this may not be a problem for advanced users, for small sites (small business, club, individual person etc) the person editing the site is often not too skilled and every new menu is a new opportunity to get lost and to click the wrong option. If I click a block, there are about seven options and only half of them should ever be used by the editor. Custom options for a site are hidden in a page properties menu somewhere and there are so many options that should never be touched on the way to get there.
* I have been disappointed by the lack of commitment to excellence and best practices by the Concrete5 team. There are so many parts of the system that are made to “just work” instead of being based on modern best practices. Half of the blocks produce HTML that you don’t want to have in a modern HTML5 based site. I know that you (jordanlev) have been working on some improved blocks, so kudos for that! Also, this is more of a general impression and I haven’t been using C5 for about a year, so things might have changed.
* Creating custom blocks comes with quite some complexity, so you either have to invest the time to create them or try to work with an existing block and work around their limitations. Try having a table on a page that can be edited by the user with the possibility to add a class to some rows so they can be highlighted with CSS.
* I’ve had a lot of performance issues, where a site would take ~10s to load the first page.
I would still use Concrete5 for projects where I know that a lot of flexibility without my intervention is needed and there are skilled people who will be able to edit the site without screwing everything up or when minimal costs are needed.
For all other (small) projects, I have started using Perch, which isn’t open source, but an absolute joy to use. It’s reasonably priced, gives you real control over the code and makes it possible to have a nice, well-documented interface for the editor where they can easily edit everything within the boundaries that are defined by the design. Where a custom block in Concrete5 needs several PHP files, an XML database schema etc you just create a HTML template file with some template tags in Perch and you have full control over the order, labels and help texts in the CMS back-end.
It took me a while to get my head around the concepts and see which problem should be solved which way in Perch, but now I finally have a CMS where I have full control over the code and can make the edit interface as easy to use as possible, with minimal effort on my part.
I realize that this sounds a bit like a sales pitch, but I have no affiliation with the developers. Of course, there’s a risk associated with using a closed-source product by a small company, but Perch has been around for a while and the development continues to be very active with a very responsive team.