Як я можу насправді оволодіти мовою програмування?


103

Я знаю, що, вивчаючи мову, ви можете просто придбати книгу, слідувати прикладами та, коли можливо, спробувати вправи. Але те, що я насправді шукаю, - це як опанувати мову після того, як ви її засвоїли.

Тепер я знаю, що досвід є одним з головних факторів, але що стосується вивчення внутрішніх мов, що є базовою структурою тощо.

Там є статті, які говорять про читання цієї книги, читання цієї книги, створення цієї гри та тієї гри. Але для мене це не означає опанувати мову. Я хочу вміти читати код інших людей і розуміти його, як би це не було важко. Щоб зрозуміти, коли використовувати функцію, а коли іншу, і т.д. і т.д.

Список може продовжуватися, але я вважаю, що я зробив це. :)

І, нарешті, візьміть будь-яку мову як приклад, якщо це потрібно, хоча найкраще було б, якби C було взято за приклад.


11
Досвід - це все, до чого насправді зводиться. Вся теорія, в якій ви експерт, марна, якщо ви практично не можете її застосувати.
Саймон Уайтхед

2
Створіть компілятор для цієї мови. Насправді, це мій улюблений спосіб випробувати будь-яку нову мову. Якщо це звучить занадто просто та нудно, спробуйте визначити формальну семантику мови, використовуючи K Framework або щось подібне.
SK-логіка

6
"людина, картопля - динозавр, всесвіт автомобілів". не має значення, наскільки ви опановуєте мову, якщо код поганий і не має сенсу, його все одно важко зрозуміти.
Ренато Діньяні

2
Я відчуваю, що трохи не вистачає точки. Мови еволюціонують, тому немає оволодіння мовою, ти з нею ростеш, чим більше ти її використовуєш, тим більше доведеться вивчати.
nycynik

2
Код і код зчитування. Візьміть випадковий фрагмент ядра Linux (програмування на C) і з’ясуйте, що робить функція.
Алекс Харт

Відповіді:


166

Я маю відповісти: "Все вищезазначене". Люди сперечаються про те, чи є кодування мистецтвом, ремеслом, інженерною дисципліною чи галуззю математики, і я думаю, що це справедливіше сказати, що це кожен із них. Таким чином, чим більше прийомів ви привчите до оволодіння мовою, тим краще. Ось частковий список:

  • Користуйтеся мовою цілий день, кожен день. Зазвичай це означає працювати на мові повним робочим днем.

  • Прочитайте все, що можна про мову. Особливо, "кращі практики" та ідіоми.

  • Приєднуйтесь до групи користувачів, щоб поговорити з іншими про мову та що вони роблять з нею.

  • Робота з кодом інших людей! Немає більш швидкого способу навчитися того, що не робити на мові, ніж прибиратись за тим, хто зробив щось жахливе.

  • Підтримайте написаний вами код - кожна помилка стає туром ваших найгірших рішень!

  • Вивчайте інформатику та мови загалом

  • Вивчіть зовсім іншу мову. Відмінним компліментом C була б така функціональна мова, як Lisp. Це перетворить вигляд думки про свою процедурну мову зсередини.

  • Навчіться використовувати рамки та API, доступні для цієї мови.

  • Знайдіть час, щоб зробити власні експерименти з мовою. SICP не застосовується до C, але ставлення до вивчення мови шляхом тестування її меж є дуже продуктивним.

  • Прочитайте історію мови, щоб дізнатися, чому вона була зроблена такою, якою вона є.

  • Відвідайте конференції, щоб почути мову авторів, що розмовляють, або щоб почути, що лідери галузі роблять з цією мовою.

  • Візьміть клас з мови.

  • Навчіть мову інших (завдяки Брайану Оуклі )

Підсумовуючи це, зробіть усе, що ви можете придумати. Немає можливості знати все про більшість мов. Кожна методика навчання, яку ви використовуєте, приносить додатковий погляд на ваше розуміння.


76
+5 для підтримки коду, який ви пишете - кожна помилка стає туром ваших найгірших рішень!
Jennifer S

8
+1 виключно для остаточного речення:Every technique you use to learn brings and additional perspective to your understanding.
Ізката

1
@Izkata: OMG, я це написав? Я насправді носій англійської мови! Я це виправив. Дякую!
GlenPeterson

2
@GlenPeterson ... Насправді я просто скопіював вставлені, не звертаючи особливої ​​уваги на те, що речення "вимкнено". +1 справді було за наміром. = P
Ізката

13
+1 для "Вивчіть зовсім іншу мову. Відмінним компліментом C була б така функціональна мова, як Lisp. Це перетворить те, що ви думаєте про свою процедурну мову зсередини". - це, мабуть, найважливіше. Це допомагає вам навчитися дізнаватися про програмування (тобто на що звернути увагу в якій ситуації).
naught101

53

10 000 годин практики - це те, що потрібно.

Читайте "Навчіть себе програмуванню на десять років"

Ключові моменти зверху:

  • Отримати зацікавлені в програмуванні, і зробити деякі , тому що це весело. Переконайтеся, що це буде достатньо весело, так що ви будете готові вкластися в свої десять років / 10000 годин.
  • Програма. Найкращий вид навчання - це навчання ділом.
  • Поговоріть з іншими програмістами; читати інші програми.

1
Ось що я збирався розмістити! Очевидно, я ще не витратив достатньо годин на P.SE.
Martijn Pieters

@MartijnPieters: :-D
vartec

8
Чудова назва книги! Я не можу чекати продовження "Навчи себе добре програмувати через 20 років!"
GlenPeterson

16
Однак вам потрібно переконатися, що ви не повторюєте одне і те ж 10 годин 1000 разів ...
Ізката

Жодна кількість технічних знань не допоможе комусь знати, для чого автоматизувати або створити програму. Це як би сказати - ходити в тренажерний зал і робити кожну фундаментальну вправу з баскетболу протягом десяти років, по 1 годині щодня. Пуф! Ви баскетбольна суперзірка (майстер) ... ні, це більше, ніж просто технічна майстерність. Тому я не вважаю це відповіддю на питання, тобто як стати майстром? Це може бути частиною рішення, але це не чарівне зілля для майстерності. Я знаю - я не господар!
oemb1905

36

НІКОЛИ не вважайте себе господарем всієї мови, поки ви не втілили кращу мову, ніж цю. Що означає, щоб дізнатися, як конкретна мова працює знизу, отримайте книгу, яка навчає вас укладачам / перекладачам понять мови. Наприклад:

  • С: Книга укладача LCC

  • C ++: Дизайн та еволюція C ++ (А потім перейдіть до створення власного компілятора C ++ або щонайменше, зрозумійте реалізацію одного за допомогою коду компілятора GNU C ++)

  • Java: Отримайте "Inside JVM" та отримайте вихідний код javac. .C-код "java" також корисний

  • Python: реалізація CPython.

  • ObjectiveC: Практично будь-який матеріал від Apple, що стосується інтернету програми ObjC env і вихідних кодів компілятора, вам допоможе.

  • Лисп: Книга SICP (навчає схему та основний перекладач-компілятор для мови, подібної до lisp): Lisp in Small Pieces (ще одна хороша книга).


1
Тепер це я називаю відповіддю. Я вже прийняв один, але це заслуговувало б "найкращої відповіді", якби це було трохи раніше
cprogcr,

2
Ви не знаєте, наскільки допомогла ваша відповідь. Я читаю про згадані вами книги, і вони потрібні мені.
cprogcr

хе-х, я дізнався від них. Рада допомогти :-)
Анікет Інге

оскільки ви згадали про С, як приклад, дозвольте дати вам назви ще двох книг, як подарунок, який я використовував для того, щоб опанувати С, як тильну сторону моєї руки): 1. OOC.PDF (у вільному доступі в Інтернеті) та 2. Minix Book (хоча книга реалізаторів ОС, ось що читав Лінус Торвальдс до впровадження Linux)
Aniket Inge

1
так, Ендрю Тененбаум, це книга. Будь-яке видання добре читати. Це не говорить вам, як працює "C", але коли ви бачите, як бібліотека C реалізована для роботи з побудованою вами операційною системою, ви починаєте розуміти C ще краще! Можливо, достатньо, щоб ви могли його змінити. (І ось там надходить OOC)
Aniket Inge

12

Спробуйте використовувати мову для чогось, для чого не планувалося використовувати. Напишіть драйвер пристрою в Python або бібліотеку маніпуляцій матрицею в COBOL. Я думаю, що один з найкращих способів оволодіти мовою - це справді її натиснути, намагаючись змусити її сильні сторони подолати її слабкі сторони.


1
Коли я навчався в коледжі, я вирішив, що колись писав понг, я "опанував" мову. Це спрацювало досить добре, поки я не навчився MIPS. У мене досі кошмари.
Родді з замороженого гороху

Веб-сайт в C можна зробити?
BigSack

10

Я полегшу тобі. Ви ніколи не освоїте мову. Період. Якщо ти думаєш, що маєш, то цього ти, очевидно, не мав. Немає гірської вершини, до якої ти раптом дістанешся і кажеш: "Ну ось, я цілком оволодів цією мовою. Що тепер?" Навіть досвідчені програмісти, які десятиліттями працюють з тією ж мовою, скажуть вам, що іноді вони все-таки стикаються з новими ідеями, процесами, практиками тощо. Справжня мета - оволодіти своїм концептуальним розумінням мови чи мов. Можливість пізнавати нові поняття та швидкість, з якою ви можете приймати нові чи змінені функції в мові, є набагато важливішою, ніж знання про кожне ключове слово та синтаксис. Перестаньте турбуватися про "оволодіння" мовою та просто переживайте за постійне вдосконалення та вдосконалення якості та ефективності вашого коду.


2
The true goal is to master your conceptual understanding of a language or languages.Саме так. Це те, що я насправді мав на увазі.
cprogcr

Будь-яка мова програмування є кінцевою. Він побудований з кінцевої кількості понять, вимагає кінцевої кількості ідіоматичних хитрощів. Тому освоїти будь-яку мову легко. Звичайно, програмування взагалі не вдається опанувати , завжди є потенціал для подальшого вдосконалення, але питання стосується конкретно мови .
SK-логіка

Логіка SK: змінюються мови програмування, а також змінюються їх бібліотеки та середовища. Як результат, змінюється і спосіб роботи з мовою. Наприклад, jQuery змінив спосіб роботи з Javascript.
orlp

Це, мабуть, правда, що ніхто не може справді опанувати таку мову, як C ++, але для дещо мінімалістичних, як-от Схема, це повинно бути цілком можливо - як стверджує @ SK-логіка, це дійсно програмування , якою б мовою вона не була освоєна, тому що область застосувань нескінченна.
близько

1
@nightcracker, мови не "розвиваються". C99 завжди буде C99 і ніколи не зміниться. C ++ 11 завжди залишатиметься C ++ 11, навіть після того, як його замінить мова наступного покоління. Навколишнє середовище "еволюціонує", так, але jQuery не представив нових мов, не відомих раніше іншим спільнотам мов. Вони були новими лише для вузької спільноти Javascript.
SK-логіка

5

Ви вже знаєте відповідь на це

  • Ви повинні використовувати мову. Багато. Щоб вирішити якомога різноманітніший спектр проблем
  • Ви повинні читати (а в ідеалі працювати з) кодом інших народів, бажано, тих, хто має ступінь оволодіння (тобто глибоке розуміння хоча б якогось аспекту мови). На розширення, якщо ви можете поговорити з людьми про вирішення проблем з мовою, то тим краще, тим краще.

Це зводиться до наполегливої ​​праці та рішучості, і до всього, до чого ви ніколи не потрапите.

Подумайте, звідки ми беремо цей термін - щоб стати майстром-майстром, ти повинен був бути учнем, а потім мандрівником, і тільки ти можеш мати шанс стати майстром. По дорозі вас навчали б і ви практикували, і ви б спостерігали і допитували інших у їхньому майстерності та (сподіваємось), вчитися у них.

Немає чарівної кулі ...


2

Почніть з читання та розуміння, що таке SDLC (він же, життєвий цикл розробки програмного забезпечення). Це ітеративний процес, який включає самовдосконалення, навчання,**practicing, practicing...**

введіть тут опис зображення

Це відкриє вам кругозір щодо того, які напрями потрібно вивчити чи вдосконалити. Існує декілька основних книжок з інженерної програми, які вам також будуть дуже корисні для читання, коли ви самостійно збираєте кілька додатків.

Крім того, як тільки ви відчуєте себе впевнено з мовою OOP , ви можете почати вивчати шаблони дизайну , і шаблони Head First Design - це справді хороша книга, яку слід розглянути. Я люблю цю книгу.


1
Дякую. Я вже обрав відповідь до моменту, коли я це прочитав, але обов'язково прийму вашу пораду.
cprogcr

Не знаю, чому зголосився, будь ласка, дайте мені знати, що потрібно покращити.
Е.Л. Юсубов

2

Немає замінника досвіду. Для того, щоб щось освоїти, вам доведеться це робити / використовувати, для багатьох різних речей.

Тож продовжуйте і використовуйте цю мову для вправ (наприклад, Project Euler ) та особистих проектів, речей, які вам потрібні, або матеріалів, які ви просто вважаєте цікавими. Напишіть гру, напишіть webapp, напишіть парсер, що завгодно. І на кожному кроці намагайтеся зрозуміти, що ви робите, а не просто скріплюючи код або дотримуючись інструкцій.

Я хочу вміти читати код інших людей і розуміти його, як би це не було важко.

Це те, що ви можете зробити відразу, зрозумівши основний синтаксис. Просто візьміть якийсь код і знайдіть час, щоб детально розібратися в ньому. Знайдіть речі, які ви не розумієте, або задайте конкретні запитання в таких місцях, як Stack Overflow .


2

На стороні проблеми на високому рівні дізнайтеся про архітектуру: як організувати свої проекти, яка її структура. Не дозволяйте їм рости випадковим чином.

На середньому рівні вивчайте різні прийоми та парадигми. Чим різноманітніші інструменти у вашому репертуарі, тим більше вам сила. Якщо ви вивчали лише Java, пітон і рубін, ви потрапили на дуже незначну частину простору програмування. Вивчіть імперативне та функціональне програмування, вивчіть пролог та Дж. Ідея полягає не в тому, щоб «опанувати» сотні мов, а дізнатися про різні способи вирішення одних і тих же проблем.

Що стосується проблеми низького рівня, одна річ, яка може допомогти вам стати кращим програмістом (насправді кращим у тому, що ви робите), - це мати хорошу розумову модель платформи. Наприклад, ви можете дізнатися, як працюють керуючі структури С та знати найпоширеніші бібліотеки, але якщо у вас немає розумової моделі того, як працюють покажчики та пам'ять, у вас виникнуть проблеми із помірно складними виразами.


1

Чи можу я зробити кілька пропозицій?

По-перше, якщо ви зможете знайти наставника, щоб обговорити використання вашої мови та отримати найкращі поради та підказки та відповісти, коли одна методика краща за іншу.

По-друге, практикуйте якомога більше і спробуйте мову максимально! Я працював у команді, яка щодня (поцікавившись) вибирала з посібника кожен словник чи інший фрагмент мови програмування. Це було знаком честі, якщо ви могли вкласти його у своє кодування того дня. Це означало, що всій команді програмування потрібно було розглянути та зрозуміти (іноді) незрозумілий термін, щоб зрозуміти та використовувати його ефективно. Деякі дні нам не вдалося, але цій команді було весело працювати і справді технічно ввімкнули !!


0

Мови програмування відображають ідеї парадигм програмування, розроблених для розробки програмного забезпечення загального призначення або для розробки програмного забезпечення спеціального призначення. Наприклад, мова програми, як Java, представляє об'єктно-орієнтовану парадигму програми, але AspectJ (розширення Java) використовується для програмування відповідно до аспектно-орієнтованого програмування.

Враховуючи це коротке вступ, для того, щоб справді оволодіти мовою, покупка та читання книги сама по собі не була б дуже корисною. Вам потрібно буде зрозуміти середовище, в якому можна запрограмувати за допомогою потрібної мови, дізнатися про парадигму та ще важливіше побудувати змістовний додаток за допомогою мови. Створення невеликого додатку, який може надати вам смак різних інструментів, що надаються мовою, - це дійсно корисний підхід до навчання.

Я бачив людей, що походять з чистої спільноти С, не дізнавшись нічого про об'єктну орієнтацію та боротьбу при вивченні Java або з метою-c. Я також бачив, як люди борються з користувальницькими інтерфейсами програмування, коли вони насправді не пішли на розуміння елементів інтерфейсу користувача, програмованого на події програмування тощо.

Я сподіваюся, що це допомагає!


0

Я додав би два пункти до списку Глена

  • Спробуйте вирішити важку проблему, яку мають інші, наприклад, дайте відповіді на ТА
  • Читайте блоги / книги дизайнерів мови. Це найкращий ресурс глибоких знань. Ви б знали, яке дизайнерське рішення стоїть за причиною X.

0

Побудувати на тому, що сказав @TMN. Я мав великий успіх у вивченні мов, написавши ту саму програму іншою мовою.

Наприклад, написання програми, яка читає у файлі CSV, аналізує текст і потім записує його назад у другий CSV із стовпцями у зворотному порядку.

Подобається це,

Стовпчик1, стовпчик2, стовпчик3

до

Стовпчик3, стовпчик2, стовпчик1

Це дозволить отримати базове розуміння або мову. Потім подивіться, що ще можна зробити. Можливо, дозволяють замінити значення або переупорядкувати чи прочитати з командного рядка. Зробіть це настільки складно, як вам хочеться.

Також я думаю, що сказав @GlenPeterson,

Вивчіть зовсім іншу мову. Відмінним компліментом C була б така функціональна мова, як Lisp. Це перетворить вигляд думки про свою процедурну мову зсередини.

Чудова ідея. Я б запропонував таку мову, як Haskell, оскільки в останніх версіях можна запрограмувати, використовуючи всі чотири парадигми програмування OO, процедурні, логічні або функціональні. Хоча це насправді функціональна мова, ви можете з певними зусиллями реалізувати інші парадигми, що було б гарним досвідом навчання.

Чудова мова, з якою можна пограти.


0

Ви не можете вивчити мову з книги. Все, що вам потрібно - це практика та практика. Не думайте, що ви можете вивчити мову з тієї конкретної книги чи з цього конкретного джерела. Думайте, мова програмування така ж, як і людська мова. Ви просто не можете вивчити англійську чи французьку мови, прочитавши певну книгу. денне життя. Код з нуля, розширіть його функціональність, спробуйте створити щось, що зробить вас трохи задоволеними. А якщо ви думаєте оволодіти мовою як знання цілої мови та використовуючи кожен елемент мови програмування у практичному кодуванні ..YOU CAN'T. Або навіть якщо ви можете, це може зайняти 10-15 років.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.