{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Concluding Remarks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Julia: Interdisciplinary science perspective\n", "- For software development in interdisciplinary fields like materials science, quantum chemistry, biology, physics and countless others, one problem is to bundle the efforts from all involved research communities.\n", "- One issue is that each field has different methods and approaches, resulting in deviating demands, for example:\n", " - **Mathematicians** often consider reduced models and edge cases\n", " - **Scientists** want to develop scientifically sound models and not worry about numerics\n", " - **Computer scientists** want to gain the best performance for a given hardware\n", " - **Practicioners** want to use the software to understand molecules or materials,\n", " so software should be easy-to-use, reliable and black-box\n", "- As a result existing software is often only suitable for the research of some involved communities, but fails to provide a general platform. One example from materials science is that the methods suggested by mathematicians (working on the their toy codes) sometimes don't make it into the packages used by practicioners.\n", "- I think Julia is well-suited to overcome these challenges of interdisciplinary software development. Both high-level and low-level developments can be jointly underdone and at the same time one is able to design interfaces, which can be used by people less oriented towards programming." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Julia: My wishlist\n", "- Better support for more advanced unit tests (test tagging, test selection, fixtures, plugin system for tests)\n", "- Better support for static code analysis\n", "- Better support for code completion and refactoring in editors (at least in VIM it's still only mäh to this point)\n", "- Package maturity and quality not uniformly distributed amoungst fields, but ... that's not such a big problem (see below)\n", "- **Important:** I think these aspects are mainly a question of time ... the basics are there, but compared e.g. to Python things have not yet developed so much into a stable common ecosystem." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Julia: User perspective\n", "- Rich and growing package landscape\n", "- Bonus on top: Keep using all your favourite python, R, C, C++ snippets\n", "- Open and welcoming community with plenty of places to ask for help\n", "- Advantageous language design:\n", " - Code generic by nature\n", " - Multiple dispatch decouples packages (since e.g. it avoids the binary operator problem)\n", " - Risk of \"dependency hell\" well reduced\n", "- Surprisingly small effort to use cutting-edge features (automatic differentiation, mixed precision, GPU)\n", "- Often combining niche packages, which have certainly never been used jointly, just works out of the box ...\n", " - ... or it takes 1 or 2 simple patches with one-line fixes to get it there" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Julia: Developer perspective\n", "- High-level language, good for rapid prototyping\n", "- The first **prototype has adequate speed** to go beyond simplistic test cases\n", "- Tools to inspect, benchmark and profile (`BenchmarkTools`, `Profile`, `@code_llvm`, `@code_native`, ...)\n", "- Tricks to selectively optimise performance (`@threads`, `@inbounds`, `@views`, `@simd`, ...)\n", "- **Philosophy:** First get it to work, then **make it fast**\n", "\n", "\n", "\n", "- Combination of strong type system and just-in-time compilation:\n", " - Code can be written generically\n", " - User can pass domain-specific knowledge about his problem\n", " to the compiler in the form of types (e.g. symmetries, positive-definiteness ...)\n", " - Enables short-cuts and dynamic switching to better optimisations\n", " - Dead code and branches may be eliminated\n", "- Machine-specific optimisations can be used ... even on inhomogeneous clusters with nodes of different processor generations\n", "- **Philosophy:** Write code once, but **reuse** it many times" ] } ], "metadata": { "kernelspec": { "display_name": "Julia 1.3.0", "language": "julia", "name": "julia-1.3" }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.3.0" } }, "nbformat": 4, "nbformat_minor": 2 }