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


11

Є багато речей, які потрібно враховувати при створенні системи, візьмемо для прикладу веб-систему, де користувачі входять у систему та взаємодіють між собою, створюючи та редагуючи вміст. Тепер я повинен думати про безпеку, перевірку (я навіть не думаю, що я на 100% впевнений, що це тягне за собою), "переконуючись, що користувачі не наступають один одному на ноги" (термін для цього?), Запобігаючи помилкам у багатьох випадків, переконавшись, що дані баз даних не стануть проблематичними через несподівані ... ситуації? Усі ці речі, я не знаю, як і де навчитися, чи є книга про такі речі? Як я вже сказав, мабуть, існує велика різниця між написанням коду і власне написанням правильного коду, знаєте, що я маю на увазі? Я відчуваю, що моєму поточному твору програмування не вистачає багато того, що я описав, і я можу побачити проблеми, які він викликає пізніше, і тоді проблеми набагато складніше вирішити, оскільки дані існують і люди її використовують. Тож чи може хтось вказати мені на книги чи ресурси або на належний підмножина програмування (?) Для цього типу навчання?

PS: сміливо виправляйте свої мітки, я не знаю, про що я говорю.

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

Відповіді:


10

Наскільки я можу сказати, професійні програмісти вивчають ці речі три основні способи:

  1. Навчання з поганого досвіду - Ви натрапили на щось не так. Ви це виправляєте. Ви кажете: "Ей, я не повинен цього робити більше. Наступного разу я зроблю X." Ви явно в густі цього.
  2. Навчання перед поганим досвідом - Врешті-решт, ти навчишся бачити певні проблеми, що виникають. Коли ви це зробите, ви спробуєте цього уникнути. Можливо, ви читаєте книгу, можливо, ви шукаєте в Інтернеті, можливо, ви спробуєте кілька експериментів.
  3. Навчання у досвідчених колег - Це далеко не найпростіше, хоча все ще непросто. Хитрість полягає у з'ясуванні того, чи відповідає колега на поганий досвід, який все ще актуальний. Зрештою, технологія рухається далі.

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


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

1
Я погодився б, Шадуре, але я думаю, що деякі погані переживання дійсно потребують того, щоб ти був своїм. Деякі люди намагаються сісти в сторону, чекаючи, поки вони зможуть зробити ідеальну річ. Але їм справді потрібно просто зайти туди і почати робити, якщо вони хочуть вдосконалити свої навички.
Вільям Піетрі

4

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

Але насправді є багато чого знати, щоб добре скласти повну систему. Існують дослідження, які підтримують 10 000 годин, оскільки обсяг практики , необхідний для досягнення рівня майстерності, і розробка інформаційних систем не є винятком з цього.


Тож я здогадуюсь, що для різних речей тоді різний, так?
MetaGuru

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

3

Мені подобається відповідь Вільяма Піетрі (+1), але я вважаю, що її потрібно додати. Навіть припускаючи, що те, що ви маєте на увазі під системами, складається виключно з програмного забезпечення.

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

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

  1. Бізнес-аналітик

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

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

  2. Системний архітектор

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

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

  3. Дизайнер системи

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

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

  4. Менеджер тестів

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

Це короткий підсумок.

Ці хлопці / дівчата - це лише загальний пробіг людей, що перебувають у ланцюгу, щоб думати про те, що треба думати.

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

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

Якщо ви хочете знати, як проектувати системи, тоді вам потрібно почати задавати питання, думаючи поза межами. Поставте себе достатньо у взуття клієнта і спробуйте подумати, що може піти не так, для чого потрібно тестування. Потім збирайтеся з реальним клієнтом і підштовхуйте їх, щоб пояснити розширення та межі системи, яку вони передбачають. Плюс кожного разу, коли я кажу «замовник», ви повинні розуміти, що це охоплює декількох дуже різних людей. Там є людина, яка користується системою день у день для того, що вона була розроблена. Там є оператор, технічна підтримка, менеджер, якому потрібен певний звіт чи інше, аудитор, команда інфраструктури, зацікавлена ​​сторона, яка за це заплатила, менеджер з якості, який потребує засобів для тестування вашої системи ... Запитайте їх усіх (і якщо вони одна людина, попросіть їх покласти всі ці шапки по одному), тому запитайте у них все, що їм потрібно, і ви добре почнете знати, які ваші системні вимоги. Звідти можна отримати архітектуру, а звідти дизайн.

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

ВПЛ, асм.


2

тут, щоб дізнатися, чи є книга про такі речі?

Не "книга". Дуже багато книг.

Там немає королівської дороги

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

Правильно.

Ви говорите про "архітектуру", програмування у великому.

Крок 1. Прочитайте багато коду. Справжня партія. Подумайте про речі, які ви хотіли б зробити. Знайдіть відповідні проекти з відкритим кодом. Прочитайте код. Все це.

Крок 2. Прочитайте більше коду. Набагато більше.

Крок 3. Прочитайте книги з архітектури.


2
Читати, читати, читати. Але я повинен припустити, що це просто не те саме, що ви дізнаєтесь, коли реально впроваджуєте реальні системи.
квентин-зірин

@qes: Питання було "де ти навчишся правильно робити системи?" Ви цього не вчите, будуючи реальні системи погано. Дійсно, реально реалізувати системи - це навпаки навчання.
С.Лотт

3
З Code Complete одна з речей, що мені найбільше сподобалась: "Програмно-інженерна сфера надзвичайно обмежено використовує приклади минулих успіхів і невдач. Якби вас цікавила архітектура, ви б вивчили креслення [відомих архітекторів] ... відвідайте деякі будівлі ... ".
Яків

@ S.Lott: хто що-небудь сказав про те, як це зробити погано?
квентин-зірин

@qes: не читаючи попереднього рівня техніки, які шанси добре виконати масштабну програму? Для такого генія, як ти, можливо, можна просто писати хороші програми у всі часи та в усіх масштабах. Але для всіх інших, хто не дивився на широкомасштабне програмування, починаючи з спроби впровадити велику систему, не читаючи нічого, це шлях до написання чогось, що містить стільки помилок, що нічого корисного з цього не можна дізнатися. Ваш досвід може бути різним, але я знаю, що я недостатньо розумний, щоб працювати, не читаючи спочатку.
S.Lott

1

Щоб посилити читання багатьох книг ....

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

Моделі дизайну за допомогою мов моделей Gamma, Helm, Johnson та Vlissides у програмах 1,2,3 та 4.

Але не намагайтеся застосовувати кожен малюнок там, де ви бачите, що його можна було б використовувати

це теж погано.

Сподіваюсь, це допомагає.


1

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

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

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

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


1
+1, хоча я б припустив, що просто робити недостатньо. Ви не знатимете, зробили ви це добре чи погано, поки не переглянете той самий код через деякий час. І навіть тоді ви можете знати, що щось не так, але не те, як це можна вдосконалити. Один із способів скоротити все це - забезпечити безліч швидких зворотних зв’язків від досвідчених людей щодо того, що ви намагаєтеся навчитися. Так, так, "робити" дуже важливо, але відгуки про те, що ви робите, можливо, ще більше, щоб прискорити процес навчання.
Мар'ян Венема
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.