Як я можу навчити яскраву людину, яка не має досвіду програмування, як програмувати? [зачинено]


100

Мене попросили взяти в наш ІТ-відділ людину, яка не має досвіду програмування, але розумна та здібна людина, і допомогти йому перейти до програмування, скажімо, розробник початкового рівня, що підтримує існуючі додатки .Net. Я безумовно вірю, що ця людина може це зробити, але я шукаю якнайшвидший спосіб прискорити його. Я маю купу ідей, але хотів подивитися, що думають інші. Я знаю, що це також буде сильно залежати від того, як він вчиться, але я говорю взагалі.

Отже, питання: на вашу думку, які найкращі способи швидкого розвитку не розробника (.Net в цьому випадку)?


1
Можливо, пов'язане питання: programmers.stackexchange.com/questions/10930/… : D
jmservera

Я чув, що Learn Python The Hard Way добре підходить для непрограмістів.
john2x

Погляньте на Small Basic . Це просто, але корисно для початківців.

3
Я думаю, що пояснювати програмування тому, хто не має розумової моделі того, про що ти говориш, марно. З'ясуйте, якою мовою ви будете говорити, і попросіть їх підручники та забруднити їх, а потім поясніть. Вони будуть боротись, і ви заскочите і прискорите процес навчання.
The Muffin Man

1
Я б попросив його прочитати Едджера Дайкстра | Про жорстокість дійсно викладання обчислювальної науки |, змусити його дізнатися про причину цієї статті, щоб він міг насторожено ставитися до можливих пошкоджень мозку, які можуть завдати йому загальноприйняті способи навчання програмуванню
vfclists

Відповіді:


125

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

Якщо ви не можете пройти цю послідовність, ви не зможете програмувати, тож ви можете відмовитися і зараз.

  1. Код, Чарльз Петцольд.
  2. Мова програмування на C, K&R
  3. Структура та інтерпретація комп'ютерних програм, Абельсон та Суссман.

Моє правило: пропрацюйте ці три книги, якщо це необхідно. Задавайте будь-які питання, але тільки після того, як ви намагаєтеся розібратися в цьому самостійно. Якщо ви зможете це зробити через ці три книги, поздоровлення, ви програміст, тепер я можу викинути вас за 15 хвилин або будь-який сміття в книжковий магазин у Великій книжковій шафі на Яві, і ви будете чудово управляти. Якщо ти не зможеш проникнути через ці три книги, здавайся, йди додому, ти ніколи цього не отримаєш.

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

Спроби скористатись ярликом та перейти безпосередньо до вивчення точної речі, яку ви хочете навчитися зараз (наприклад, починаючи з C # та ASP.NET), приречені.


25
Як хтось, кому довелося стукати головою об стіл над "програмістами", які настійно рекомендували свої C # здібності, але не могли робити прості речі, як-от реалізувати дуже добре задокументований базовий клас, знайти витоки пам'яті в програмах c і c ++, або просто вирішити проблему самостійно або навчитися новій ідеї навіть в помірному темпі, я згоден. Це не елітаризм; це здоровий глузд. Якщо ви не можете опанувати покажчики та рекурсії, ви ніколи не будете дуже корисні тим, хто потребує розробників, які можуть самостійно вирішувати проблеми.
Джонатан Хенсон

53
Ні, це не єдиний спосіб бути хорошим програмістом. Але якщо три книги - це "страшний список", то ви, можливо, недооцінюєте те, що роблять програмісти.
Джоель Спольський

32
Іноді ти так не в контакті, Джоел.
Роберт С.

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

19
На жаль, ця відповідь не відповідає up to speed quickly.
rlb.usa

30

Найкращий спосіб швидко не швидко розвинути розробник - надихнути їх !

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

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

Я повністю згоден з @karudzo - самовдосконалення та конструктивний огляд можуть бути дуже надихаючими.


29
"Якщо ви хочете побудувати корабель, не барабаняйте людей збирати деревину і не привласнюйте їм завдання та роботу, а навчіть їх прагнути до нескінченної величини моря". - Антуан де Сент-Екзюпері
Жульєн Частанг

Жульєн - приємно! Саме так!
jkoreska

Я повністю згоден з вами на цьому! Я наставляв / навчав багатьох розробників, які не мали досвіду і часом не мали ідеї, що в кінцевому підсумку вони стануть програмістами. Я зробив це просто, провівши їх по дорозі ... їх власна цікавість і пристрасть призводять їх до кінцевого результату. Якби у них не було жодного з цих двох атрибутів, я не вірю, що вони могли б досягти того, чого вони досягли. Я працюю з занадто великою кількістю програмістів, яким не вистачає одного або обох цих атрибутів і є в ньому тільки тому, що є багато роботи ... це жахливо!
Jeach

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

12

Я шукаю якнайшвидшого способу змусити його швидкість.

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

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

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

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

Щодо того, як це зробити: я не маю під рукою повноцінної навчальної програми, яку слід вставити. (Вибачте.)
Хоча я б рекомендував почати з навчання йому однієї мови програмування, щоб він мав шанс досягти швидкого початкового прогресу та отримати якісь обнадійливі результати. Існує досить багато книг для викладання таких мов, виберіть одну, з якою ви знайомі. Якщо в книзі багато вправ, і він готовий їх виконувати, будьте готові витратити багато часу, допомагаючи йому в цьому. Якщо у книзі немає (м) жодної, почніть придумувати свої власні заздалегідь, але будьте готові адаптувати їх до його рівня / швидкості розуміння.
Якщо ця перша мова не була ні C, ні C ++, IMO він повинен вивчити одну з наступних. K&R добре для цього, як і TCPL Stroustrup або, якщо він може (з вашою допомогою) боротися зі крутою кривою навчання, Koenig / Moo. Причина, яку я рекомендую, полягає в тому, що, як тільки ви знаєте C або (бажано IMO) C ++, можна підібрати будь-який з цих похідних C, наприклад C #, Java, ObjC ...

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


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

1
@KirkBroadhurst: Якщо так, то у вашій компанії щось не так.
sbi

@sbi Я думаю, що ви знайдете щось не так у багатьох компаніях. Компанія ОП пропонує, щоб непрограміст (але він "розумний хлопець"!) Перейшов на роль, яка виконує підтримку додатків. Я не знаю, де ти працюєш ... але, на мій досвід, це "реальний світ". Дійсно хороші, грамотні програмісти - це виняток - як і в більшості галузей, більшість людей роблять достатньо добре, щоб обійтись.
Кірк Бродхерст

1
@KirkBroadhurst: Де я працюю, це моє рішення. Я втік з компаній, бо некомпетентний, і я б тікав, якщо ніхто з розробників не знає хоча б більшості цих речей.
sbi

7

Я б не запускав їх у .NET. Я занадто багато разів робив цю помилку. Не дозволяйте роботодавцю тиснути на вас, щоб створити некомпетентного програміста через час. .NET може бути платформою для швидкого розвитку, але це не змушує розробників вивчати програмування. Тільки в C # ви знайдете розробника, який зациклюється на еталонних типах, терміні експлуатації об'єкта, вони залишать величезні витоки пам'яті (так це можливо в .NET) і матимуть погані конструкції. Було б набагато краще запустити їх на C або C ++ (можливо, на C ++, оскільки їм потрібно буде використовувати концепції OOP), а потім сказати щось на кшталт: "Не було б добре, якби вашою пам’яттю керували, кожна річ була предметом -орієнтована, і вам не довелося мати справу з усіма цими неприємними покажчиками? " Ось C # і JAVA. Якщо вони освоїли c ++, вони підкорять обох через тиждень-два. Рекомендую полк Джоела. Це був список, який мені дав мій вчитель CS 101, і мені було набагато краще, коли я потрапив на числовий аналіз через це. Це також дозволить вам дізнатися раніше, чи буде кандидат різати гірчицю чи ні. Крім того, щойно ви отримаєте c і c ++, ви автоматично зрозумієте c # і java, прочитавши вступ до книг. Ви не тільки зрозуміли б їх, але й зрозуміли б їх краще, ніж той, хто не знав c і c ++.


4
"" Зараз би не було б добре, якби вашою пам’яттю керували, кожна річ була орієнтована на об'єкти, і вам не довелося мати справу з усіма цими неприємними покажчиками? Ви маєте на увазі Ось STL. Чому ви не навчили мене використовувати STL в C ++ з самого початку ?!
Raynos

Ну, STL - солодкий. Я маю на увазі більше API API, наскільки йде програмування Windows. API Windows не розроблений з урахуванням OOP. Мені здається чудовим вправою зробити так, щоб якийсь поганий хлопець написав заявку за допомогою API в c ++. Потім я змушую його / її написати клас Window і інкапсулювати цикл подій і так далі ... ви знаєте, зробіть його об'єктно орієнтованим. Потім, коли вони нарешті працюють, я показую їм Windows Forms. Це дійсно змушує їх розібратися з деякими основними поняттями - тобто, як працює програма Windows - чого хтось ніколи не отримає, якби просто заскочив у .NET.
Джонатан Хенсон

4
чому б хто доторкнувся до API API Windows. Я маю на увазі, говорили про hWNDвірно з 80-х? Зрозуміло, ви замість цього використовуєте приємну абстракцію (яка абстракція - зовсім інша дискусія). Звичайно, добре знати, як це працює під кришкою, але це вам не потрібно C # .NET для абстракції
Raynos,

2
API Windows дивовижний. У будь-якому випадку, я використовую його лише для навчального інструменту. Наприклад, люди зазвичай не розуміють, як події чарівно розпалюються у програмах Windows. Їм корисно дурити з циклом подій. Крім того, програмістам потрібно хоча б ознайомитись з hWND, особливо якщо вони матимуть справу з будь-якими апісами, які дуріють з графікою - так само, як вам буде важко робити що-небудь в Unix, не знаючи, як використовувати XID. У будь-якому разі, це змушує їх дізнатися, як працює програма Windows. Крім того, як тільки вони закінчать, вони знають, як працює Windows.Forms.
Джонатан Хенсон

Це не повинно бути переходом до C # btw, лише до .NET взагалі. Я думаю, що @Joel має хорошу статтю про Закон про непрохідні абстракції щодо того, чому програмістам часто добре заглянути під капот, перш ніж використовувати рамки.
Джонатан Хенсон

6

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


6

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

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


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

Так, змусьте їх рухатись з парним програмуванням і дайте прості завдання - реальні завдання, на програмне забезпечення, над яким вони повинні працювати, мовою, якою вони повинні працювати, з реальним виконанням. Перегляньте та наставляйте всю свою роботу, і вони будуть прогресувати.
Thomas W

2

Дайте йому гарну ідею (візуальні студії, експрес - це все-таки добре). Навчіть його загальним 60% синтаксису (залиште урожай, linq, перерахунки, атрибути тощо), викладайте класи, віртуальне та переосмислення). Проведіть час на налагоджувальнику (особливо стоп-сигналу). Потім скажіть йому в Google "msdn functionanme", коли йому потрібна допомога, і це повинно його швидко відключити.

Також навчіть його ніколи не ловити і не ковтати виняток. Скажіть йому, що він повинен повторно скинути або записати його!

Бонус: навчіть його серіалізувати дані json, щоб він міг легко читати / записувати у файл. ДБ є надмірним і занадто багато для навчання, і ви не хочете, щоб він писав власні формати файлів, хоча я можу дозволити пройти один запис на тип рядка для збереження / завантаження рядкового масиву як прийнятного.


1

Я знаю, що багато людей говорили про мови та книги для цих мов. Я відрізняюся.

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

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

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

Тепер змусьте їх перепрограмувати попередню проблему з цими новими концепціями.


1

Почніть його з основ: змінних, циклів, а циклів - для циклів, масивів, навчіть його основ, друку на екрані, виконуючи просту математику. Перейдіть до методів та основних OOP, такі речі, як ось як створити клас, покажіть йому, чому не просто як.

Мова не має значення, але виберіть щось, що знаєте, і це дуже абстрактно (java, python тощо). Таким чином, йому не потрібно турбуватися про такі речі, як управління пам'яттю, покажчики тощо ... Навчіть основ рекурсія, вежі з аніо або рекурсивно пошукові каталоги.

Навчись програмувати - це хороший безкоштовний ресурс програмування Ruby. Зробіть це веселим, легким та розважальним.


1

Поставте йому деякі виклики і дайте йому навчитися шукати ресурси для вирішення проблеми самостійно.

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

Зрештою, пристрасть / інтерес, безумовно, стане ключовим фактором того, наскільки успішними вони будуть у навчанні цього швидко. Якщо у нього немає «помилки», або це може бути повільним і / або болючим процесом. Якщо він все-таки зловить помилку, він буде пізно кодувати, поза робочим часом, мати час свого життя.

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