LINUX.ORG.RU
ФорумTalks

Порядок изучения языков

 , , ,


1

6

Нашёл я один тред, в котором обсужадлось с чего следует начинать программирование.
В каком порядке лучше изучать языки, если человек ранее не занимался ни в каком виде программированием? С Си, либо с Лиспа?

Лично у меня было в таком порядке.

1. Книги: SICP, Guide to Assembly Language Programming in Linux, Assambler of Infinity, K&R, GNU Emacs Lisp Reference Manual, The GNU C Library.

2. Языки: ASM, C, ELisp, CLisp, Clojure, Rocket.

Вот задумался. В идеале как следовало изучать будущему программисту-емаксеру, чтобы сформировать правильно мозг. Одни говорят, что изучение с Си правильно подготавливает мозг, а другие, что ломает.
С чего вдруг заинтересовало: один знакомый собирается быть программистом и спросил какие языки в каком порядке ему изучать.
Естественно, я назвал свои любимые языки и обосновал, а вот в каком порядке?


Изучать в первую очередь нужно не языки. Блин, прям представляю себе пост на форуме музыкантов, мол: "В каком порядке учить ноты, помогите! Начать с Ре, или может быть с Си? А интервал? Тритон или сексту?"

templarrr ★★★★★ ()
Последнее исправление: templarrr (всего исправлений: 1)

Не дури и начни с васика, или как там его теперь называют? О, пистон!

Учить надо не языки впрок, а начать хотябы с алгоритмов.

beastie ★★★★★ ()

После императивных языков освоить функциональные будет туго.

Meyer ★★★★ ()

Язык программирования изучается, исходя из поставленных задач. На каком ЯП легче и проще решить задачи, тот и берётся за осмысление и реализацию конкретного работающего решения. Остальное - вкусовщина и личные пристрастия.

iZEN ★★★★★ ()

С Си, либо с Лиспа?

Как насчёт того, чтобы начать с чего-то, что позволило бы найти работу? Python или Java там.

Хотя в принципе языки не важны.

Deleted ()

Я бы посоветовал начать с теории. Не стоит лезть сразу лепить опердени - получается говно. Я наблюдаю много таких погроммистов. Я и сам из них и очень жалею, что просрал фундаменталку, щас трудно (время) это все осваивать. Но с каждым прочитанным/прорешанным/усвоенным фундаментальным трудом в голове действительно прибавляется. А языки - одинаково хреново я могу писать и на питоне, и на окамле, и на ассемблере. Так что дело не в языках. Язык - это просто средство выражения и он в основном подбирается под задачу.

Про реплики вроде «после императивщины - функциональщина сложна» можно сразу выкидывать в мусорку. Потому что любой подход по своему прекрасен и ущербен и нужно просто знать, что, как и где применять. Серебряной пули нету.

slaykovsky ★★★ ()

В такой последовательности: OCaml/Haskell, assembler, Java, C++.

invy ★★★★★ ()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от slaykovsky

Я бы посоветовал начать с теории. Не стоит лезть сразу лепить опердени - получается говно.

Так в том-то и дело, что сейчас считать теорией? Кнута? Дейкстру? Буча?

Haskell многие алгоритмы ставит с ног на голову за счёт совсем других базовых структур данных (есть ленивый список, нет массива).

monk ★★★★★ ()

А для чего тебе нужно программирование?

olibjerd ★★★★★ ()
Ответ на: комментарий от invy

И в конце концов будет очередной хаскеллист, который много знает, но нихрена не умеет и тем более не может.

Tark ★★ ()

Его все начинают с Васика. У меня в институте был турбопаскаль. Потом я стал изучать баш и питон.

hhhhacker ()

Ломает мозг одновременное изучение нескольких языков. Такая каша потом в голове.

hhhhacker ()

С чего следует начинать программирование?

С программирования.

Unicode4all ★★★★★ ()

1. Математическая логика.
2. SICP
3. Алгоритмы и структуры данных (в общем, чтобы знать сколько их есть и где быстро понять очерченный круг вопросов возникающих в связи с этим.)
4. Для всего остального есть Stackoverflow.
5. Изучай С++, т.к. это вечный язык программирования, почти как геморрой (если не лечить ).

TomBOY ★★ ()
Ответ на: комментарий от beastie

Не дури и начни с васика, или как там его теперь называют? О, пистон!

Два чая этому модератору.

Manhunt ★★★★★ ()
Последнее исправление: Manhunt (всего исправлений: 1)
Ответ на: комментарий от slaykovsky

Я бы посоветовал начать с теории.

Без практики кодинга теория будет пустым звуком. Эти вещи нужно перемежать.

Manhunt ★★★★★ ()
Ответ на: комментарий от Manhunt

В основном же задачки решаются в книжках. Голая теория из головы вылетает так же быстро, как и залетает, я согласен полностью.

slaykovsky ★★★ ()
Ответ на: комментарий от monk

Ну по опыту нужно знать алгоритмы классические на уровне «знаю, где можно применить». Это для того, чтобы на джуна попасть, например, или в крупную компанию. Был печальный опыт, когда я сел жопой в лужу на вот таком алгоритмическом хенгаутсе с гугилом (и вообще на собеседованиях чувствую себя заключенным гулага, но это уже мои психологические расстройства) :)

С ленивыми вычислениями все интересней :) Но во многих книжках все расжевано хорошо. Есть вот книжка с задачами замечательная «жемчужины программирования», и есть «жемчужины функционального программирования» (не помню автора. Вот там как раз все те же задачи, только с разбором с точки зрения функционального программирования и хаскеля в частности :)

Еще вспомнил как придумывал внешнюю сортировку на собеседовании в мейрушечку в тарантул. Вот тогда как раз и прозрел, что завернул в тупик. Но благодарю очень Костю Осипова, что он меня не смешал с говном, а сказал что делать дальше и вроде как вдохновил :)

slaykovsky ★★★ ()
Последнее исправление: slaykovsky (всего исправлений: 1)

Одни говорят, что изучение с Си правильно подготавливает мозг, а другие, что ломает.

Программирование ломает мозг. Учи матан.

Deleted ()
Ответ на: комментарий от slaykovsky

Ну по опыту нужно знать алгоритмы классические на уровне «знаю, где можно применить». Это для того, чтобы на джуна попасть, например, или в крупную компанию.

Для этого не надо знать алгоритмы. Надо заучить сотню правильных ответов на вопросы.

С ленивыми вычислениями все интересней :) Но во многих книжках все расжевано хорошо. Есть вот книжка с задачами замечательная «жемчужины программирования», и есть «жемчужины функционального программирования»

Подход хаскеля учит неправильно считать операции. Точнее совсем не считать. Вот это

primes = sieve [2..] 
  where sieve (p:xs) = 
          p : sieve [x | x <- xs, x `mod` p /= 0]
похоже на решето Эратосфена, но им не является (и гораздо медленней).
quicksort :: Ord a => [a] -> [a]
quicksort []     = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
    where
        lesser  = filter (< p) xs
        greater = filter (>= p) xs
похоже на QuickSort, но даёт опять же намного худшую асимптотику.

Его можно учить как первый язык, но на нём нельзя давать классические алгоритмы (так как решение будет или неправильное, или очень некрасивое с монадой состояния и кучей кода, который заслоняет алгоритм).

Правильное решето Эратосфена на Хаскеле:

import qualified Data.Set as PQ

primes :: [Integer]
primes = 2:sieve [3,5..]
  where
    sieve (x:xs) = x : sieve' xs (insertprime x xs PQ.empty)

    sieve' (x:xs) table
        | nextComposite == x = sieve' xs (adjust x table)
        | otherwise          = x : sieve' xs (insertprime x xs table)
      where 
        (nextComposite,_) = PQ.findMin table

    adjust x table
        | n == x    = adjust x (PQ.insert (n', ns) newPQ)
        | otherwise = table
      where
        Just ((n, n':ns), newPQ) = PQ.minView table

    insertprime p xs = PQ.insert (p*p, map (*p) xs)
и на Си
#include <stdio.h>
#include <stdlib.h>

#define LIMIT 10000000 /*size of integers array*/

int main(){
    unsigned long long int i,j;
    int *primes;
    int z = 1;

    primes = malloc(sizeof(int)*LIMIT);

    for (i=2;i<limit;i++)
        primes[i]=1;

    for (i=2;i<limit;i++)
        if (primes[i])
            for (j=i;i*j<limit;j++)
                primes[i*j]=0;
    // output
    for (i=2;i<limit;i++)
        if (primes[i])
            printf("%dth prime = %dn",z++,i);

return 0;
}

monk ★★★★★ ()

У меня было так

немного Java -> C Керниган&Ритчи -> немного С++ -> lisp'оязыки от SICP и Little Schemer -> ещё больше С (потому что работа)

Бытует мнение, что изучение С позволяет понять «как работает машина» или что-то в этом роде, но лично я с ним не согласен.

grimwaken ()
Ответ на: комментарий от monk

Для этого не надо знать алгоритмы. Надо заучить сотню правильных ответов на вопросы.

Тут я не соглашусь. Самому же интересно находить решения, а не чьи то из cracking the code interview шаблонные расписывать. Ну и с алгоритмами легче намного работать. Я же говорю, у меня такая проблема и я ее решаю :)

У тебя не так, а вот у меня так. Тут субъективщина во все поля.

slaykovsky ★★★ ()
Ответ на: комментарий от slaykovsky

Если для цели «Это для того, чтобы на джуна попасть, например, или в крупную компанию.», то алгоритмы знать на самом деле не надо.

Также как для того, чтобы решать задачи по геометрии не надо знать доказательства теорем.

Для общего развития, разумеется, полезно.

Для решения задач нужны не алгоритмы, а «паттерны». Хоть в виде Буча и ООП, хоть в виде «делим задачу на подзадачи и пишем словами» по Дейкстре. Причём в жизни они часто деградируют до «рецептов»: «для вывода таблицы в html возьмите этот кусок кода и поправьте».

monk ★★★★★ ()
Ответ на: комментарий от beastie

А ничего что дабы понять практическое применение алгоритмов их как минимум надо на чём-то реализовывать?

raven_cler ★★ ()
Ответ на: комментарий от raven_cler

Мне (и не тодько мне) в своё время хватало карандаша и тетрадки.

beastie ★★★★★ ()
Ответ на: комментарий от beastie

Ну сейчас как бы другое время. Зачем усложнять себе жизнь?

raven_cler ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.