Как быстро и эффективно изучать языки программирования

Автор: Игорь Коротач

Зачем вообще учить языки программирования?

  • Вам достался проект с новым языком
  • Вы решили сменить сферу деятельности (веб -> мобайл)
  • Вы решили сменить язык программирования (js -> python)
  • Вам просто интересно :) 

Есть ли какой-то простой путь быстро выучить язык программирования?

И да, и нет...

Что для вас означает "Я знаю  язык программирования X!"?

  1. Я понимаю синтаксис языка программирования
  2. Я могу писать программы, которые принимаются компилятором/интерпретатором
  3. Я могу дебажить и фиксить баги в своих и чужих программах, где присутствует несложный код
  4. Я продуктивен в написании кода, который решает поставленную задачу
  5. Я могу писать код, который использует уникальные функции этого языка (я владею данным языком)

Какие сферы разработки ПО вы знаете?

Какие языки там используются?

  • Web (Python, Java, JS, C#, Ruby, Go)
  • Mobile (Objective-C, Swift, C#, Java, Kotlin)
  • Desktop (Java, C#)
  • Scientific computing (Python, C++, Fortran)
  • Embedded (C, C++, Ada)
  • Big Data (Scala, Java)
  • OS (C, C++, Rust)
  • Database (SQL)
  • DSL (Bash)
  • Parser/Lexer (OCaml, Haskell, Lisp)
  • Gamedev (C++, Lua, C#)

Какие общеинженерные дисциплины связывают все эти языки?

  • Алгоритмы и структуры данных
  • Подходы к структуре и проектированию программ
  • Теория компиляторов/интерпретаторов
  • Механизм параллелизации 

Подход к структуре и проектированию

Data first

Transformations first

Transformations first

(defn calculate* []
   (->> (range 10)
        (filter odd?)
        (map #(* % %))
        (reduce +)))
logWarn :: String -> String
logWarn = warning . correctSpaces . asciiOnly

Clojure (Lisp)

Haskell

Data first

class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age

p1 = Person("John", 36)
class Person {
    String name;        // имя
    int age;            // возраст
    void displayInfo(){
        System.out.printf("Name: %s \tAge: %d\n", name, age);
    }
}

Python

Java

Теория компиляторов и интерпретаторов

  • Компилятор (ручная или автоматическая контроль памяти)

  • Интерпретатор

  • JIT-компилятор

Компилируемые языки

  • Типы

  • Generics

  • Кодогенерация (макросы)

  • Высокая формализация кода

Generics

int get_minimum_int (int * nums, size_t len){
    int min = nums[0];

    for (size_t i = 1; i < len; i++) {
        if (nums[i] < min) {
            min = nums[i];
        }
    }

    return min;
}

float get_minimum_float (float * nums, size_t len){
    float min = nums[0];

    for (size_t i = 1; i < len; i++) {
        if (nums[i] < min) {
            min = nums[i];
        }
    }

    return min;
}

Non generic

static <T> T get_minimum(T[] nums, int len){
    T min = nums[0];

    for (int i = 1; i < len; i++) {
        if (nums[i] < min) {
            min = nums[i];
        }
    }

    return min;
}

Generic

Macros

(+ 1 1) ; - обычный вызов в Clojure "+" воспринимайте как обычную функцию в которую передали 2 параметра
; => 2

(defmacro infix - название макроса
  "Use this macro when you pine for the notation of your childhood"
  [infixed] ;;;; - Это выражение, которое принимает макрос
  (list (second infixed) (first infixed) (last infixed)))
;               +                1               1
  
(infix (1 + 1))
; => 2

; чем-то похоже на функцию eval в Python, которая работает не со строками, а с выражениями

JIT-Компилируемые языки

  • Типы (optionally)

  • Generics (optionally)

  • Рефлексия

  • Формализация кода ниже, чем у компилируемых, но выше, чем у интерпретируемых

Рефлексия

# Без рефлексии
obj = Foo()
obj.hello()
 
# С рефлексией
class_name = "Foo"
method = "hello"
obj = globals()[class_name]()
getattr(obj, method)()

Механизм параллелизации

GIL mostly

Threading

Green Threading

Язык и его экосистема

Software ecosystems are large collections of software packages that depend on each other and co-evolve

Язык + Экосистема

сложный язык - сложная эко

C++ (98, 03, 11, 15, 17, 21 standards)

C# (.NET classic, .NET core)

средний язык - сложная эко

Java (Java 8 vs Java 15+)

Python,

Ruby

сложный язык - простая эко

Haskell

OCaml

Elixir/Erlang

Rust

простой язык - простая эко

Go

Clojure

простой язык - сложная эко

C

Cobol

Спасибо за внимание!

Учите общеинженерные дисциплины и интересуйтесь разными сферами разработки.

Learning programming languages

By Igor Korotach

Learning programming languages

  • 236