Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Чым Java адрозніваецца ад іншых папулярных моў? Чаму менавіта Java можа быць першай мовай для вывучэння? Давайце складзем план, які дапаможа вывучыць Java як з нуля, так і з ужываннем навыкаў праграмавання на іншых мовах. Пералічоны адрозненні паміж стварэннем прадакшэн-кода на Java і распрацоўкай на іншых мовах. Міхаіл Зацяпякін прачытаў гэты даклад на сустрэчы для будучых удзельнікаў. стажыроўкі Яндэкса і іншых пачынаючых распрацоўшчыкаў - Java Junior meetup.


— Усім прывітанне, мяне клічуць Міша. Я распрацоўшчык з Яндекс.Маркета, і сёння я раскажу вам, навошта вучыць Java і як рабіць гэта эфектыўна. Вы можаце задаць слушнае пытанне: чаму гэта буду расказваць я, а не які-небудзь моцны распрацоўшчык з кучай гадоў стажу? Справа ў тым, што я сам вывучаў Java нядаўна, гады паўтара таму, таму яшчэ памятаю, як гэта прыкладна было і якія ёсць падводныя камяні.

Год таму я патрапіў на стажыроўку ў Яндэкс.Маркет. Распрацоўваў бэкенд для "Беру", для самога Маркета, вы напэўна ім карысталіся. Цяпер працягваю там працаваць, у іншай камандзе. Мы робім аналітычную платформу Яндекс.Маркета для бізнес-партнёраў.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Давайце прыступім. Навошта вучыць Java з практычнага пункта гледжання? Справа ў тым, што Java – гэта вельмі вядомая мова праграмавання. У яго вельмі вялікае кам'юніці.

Напрыклад, ёсць такі TIOBE-індэкс, папулярны азначнік папулярнасці моў праграмавання, і Java тамака займае першае месца. Таксама на сайтах з вакансіямі вы напэўна заўважыце, што большасць вакансій - як раз ткі пра Java, гэта значыць распрацоўваючы на ​​Java, вы заўсёды зможаце знайсці сабе працу.

Паколькі кам'юніці вельмі вялікае, на любое ваша пытанне знойдзецца адказ на якім-небудзь Stack Overflow ці іншых сайтах. А яшчэ, распрацоўваючы на ​​Java, вы, насамрэч, пішаце код па JVM, таму зможаце лёгка перасесці на Kotlin, Scala і іншыя мовы, якія выкарыстоўваюць JVM.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Чым добрая Java з ідэалагічнага пункта гледжання? Ёсць розныя мовы праграмавання. Яны рашаюць розныя задачы, вы гэта ведаеце. Напрыклад, на Python вельмі выдатна пісаць аднарадковыя скрыпты для рашэння хуткіх задач.

На плюсах можна цалкам кантраляваць выкананы код. Напрыклад, у нас ездзяць машынкі, беспілотныя аўтамабілі Яндэкса, іх код напісаны на плюсах. Чаму? У Java ёсць такая штука – Garbage Collector. Яна ачышчае аператыўную памяць ад непатрэбных аб'ектаў. Гэтая штука запускаецца спантанна і робіць stop-the-world, гэта значыць спыняе ўсю астатнюю праграму і ідзе лічыць аб'екты, чысціць памяць ад аб'ектаў. Калі такая штука будзе працаваць у беспілотніку, гэта не крута. Ваш беспілотнік будзе ехаць прама, у гэты момант чысціць памяць і ніяк не глядзець на дарогу. Таму беспілотнік напісаны на плюсах.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Якія задачы рашае Java? Гэта ў першую чаргу мова для распрацоўкі вялікіх праграм, якія пішуцца гадамі, дзясяткамі ці сотнямі людзей. У прыватнасці, шмат бэкенда ў Яндэкс.Маркеце напісана на Java. У нас размеркаваная каманда ў некалькіх гарадах, па дзесяць чалавек у кожным. І код лёгка падтрымліваць, ён падтрымліваецца ўжо дзесяць і больш гадоў, і пры гэтым прыходзяць новыя людзі, разбіраюцца ў гэтым кодзе.

Якімі характарыстыкамі павінен валодаць мову, каб код на ім быў лёгка які падтрымліваецца і каб яго лёгка было распрацоўваць у вялікіх камандах. Гэта ў першую чаргу павінен быць чытэльны код, і на ім павінна быць лёгка рэалізоўваць складаныя архітэктурныя рашэнні. Гэта значыць на ім павінна быць лёгка пісаць высокаўзроўневыя абстракцыі і т. д. Усё гэта як раз і падае нам Java. Гэта аб'ектна-арыентаваная мова. На ім сапраўды проста рэалізоўваць высокаўзроўневыя абстракцыі і складаныя архітэктуры.

Таксама існуе вельмі шмат фрэймворкаў і бібліятэк для Java, таму што мове ўжо больш за 15 гадоў. За гэты час на ім было напісана ўсё, што магло быць напісана, таму ёсць шмат бібліятэк для ўсяго, што можа вам спатрэбіцца.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Якімі асноўнымі скіламі, на мой погляд, павінен валодаць пачатковец джавіст? У першую чаргу, гэтае веданне мовы Java core. Далей гэта які-небудзь Dependency Injection фрэймворк. Пра гэта больш поўна будзе расказваць наступны дакладчык Кірыл. Я асабліва паглыбляцца не буду. Далей гэта архітэктура і патэрны праектавання. Нам трэба ўмець пісаць архітэктурна прыгожы код, каб пісаць вялікія прыкладанні. І гэта які-небудзь SQL ці ORM для задач працы з базай. І гэта больш датычыцца бэкенда.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Паехалі! Java core. Тут я асабліва Амерыку не адкрыю - трэба ведаць саму мову. На што трэба звярнуць увагу. Па-першае, Java выйшла вельмі шмат версій за апошнія гады, гэта значыць у 2014-2015 годзе выйшла сёмая, потым восьмая, дзевятая, дзясятая, вельмі шмат новых версій, і ў іх уводзілі вельмі шмат новых крутых штук, напрыклад, Java Stream API , лямбда і т. д. Вельмі клёвыя свежыя стромкія штукі, якія выкарыстоўваюцца ў production-кодзе, пра што пытаюцца на сумоўях і якія трэба ведаць. Таму не варта браць кнігу з паліцы ў бібліятэцы Java-4 і ісці яе вучыць. Такі сабе план: вучым Java-8 або вышэй.

Уважліва зважаем на новаўвядзенні, такія як Stream API, var, і т. д. Іх пытаюць на гутарках, увесь час выкарыстоўваюць у production. Гэта значыць у Stream API моцна страмчэй цыклаў, наогул, вельмі крутая штука. Звярніце ўвагу абавязкова.

І ёсць яшчэ ўсякія штукі накшталт ітэратараў, Exceptions і гэтак далей. Тое, што здаецца вам няважным, пакуль вы пішаце нейкі маленькі код самі. Вам не патрэбны гэтыя Exceptions, каму яны наогул патрэбны? Але іх сапраўды будуць пытаць на сумоўях, яны сапраўды вам спатрэбяцца ў прадакшэне. Увогуле, варта звярнуць увагу на Exceptions, ітэратары і іншыя штукі.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Структуры даных. Без структур нікуды, пры гэтым будзе выдатна, калі вы будзеце не проста ведаць, што бываюць set, dictionary, лісты. А яшчэ розныя рэалізацыі структур. Напрыклад, у той жа dictionary у Java шмат рэалізацый, у тым ліку HashMap і TreeMap. У іх розныя асімптотыкі, яны па-рознаму ўладкованыя ўсярэдзіне. Трэба ведаць, чым яны адрозніваюцца, калі якую выкарыстоўваць.

Таксама вельмі выдатна будзе, калі вы будзеце ведаць, як працуюць гэтыя структуры дадзеных унутры. Гэта значыць не проста ведаць іх асімптотыкі - за колькі працуе стаўка, за колькі працуе праход, а як працуе структура ўнутры - напрыклад, што такое бакет у HashMap.

Таксама варта звярнуць увагу на дрэвы і графы. Гэта такія штукі, якіх не вельмі шмат у прадакшэн-кодзе, але іх любяць на сумоўях. Адпаведна, трэба ўмець абыходзіць дрэвы, графы ў шырыню, глыбіню. Гэта ўсё просценькія алгарытмы.

Як толькі вы пачнеце пісаць колькі-небудзь вялікі код, складаны, з выкарыстаннем бібліятэк, шматкласавы код, вы зразумееце, што вам цяжка без сістэм зборкі і resolve-залежнасці. Гэта, у першую чаргу Maven і Gradle. Яны дазваляюць вам імпартаваць бібліятэкі ў ваш праект рэальна ў адзін радок. Гэта значыць, вы пішаце аднарадковы xml і імпартуеце ў праект бібліятэкі. Выдатныя сістэмы. Яны прыкладна аднолькавыя, выкарыстоўвайце любую - Maven або Gradle.

Далей - якая-небудзь сістэма кантролю версій. Я рэкамендую Git, таму што ён папулярны, ёсць куча тутарыялаў. Амаль усе карыстаюцца Git, зэбая штука, без яе нікуды.

І - якое-небудзь асяроддзе распрацоўкі. Я рэкамендую IntelliJ Idea. Яна вельмі моцна паскарае працэс распрацоўкі, моцна вам дапамагае, піша за вас усякі boilerplate-код, увогуле, клёвая.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Спасылкі са слайда: SQLZOO, хабрапост

SQL. Крыху пра бэкендэраў. Тут, насамрэч, быў пацешны кейс. Мне за два дні да маёй другой гутаркі на стажыроўку патэлефанавала дзяўчына-HR і сказала, што мяне праз два дні будуць пытацца SQL і HTTP, трэба вывучыць. А я ня ведаў ні пра SQL, ні пра HTTP прыкладна нічога. І я знайшоў такі клёвы сайт - SQLZOO. На ім я вывучыў SQL гадзін за 12, у сэнсе, сінтаксіс SQL, як пісаць SELECT-запыты, JOIN і т. д. Вельмі клёвы сайт, вельмі рэкамендую. Рэальна за 12 гадзін вывучыў 90% таго, што я ведаю зараз.

І яшчэ выдатна ведаць архітэктуру баз даных. Гэта ўсякія ключы, індэксы, нармалізацыя. Пра гэта ёсць серыя пастоў на Хабры.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

У Java, акрамя SQL, ёсць усякія Object-relational mapping-сістэмы тыпу JPA. Ёсць нейкі код. У першым метадзе нейкі SQL-код - SELECT id name FROM info.users WHERE id IN userIds. З базы дадзеных users, з табліцы, атрымліваюць іх айдышнікі, імёны.

Далей ёсць нейкі мапер, які ператварае аб'ект з базы ў джававы аб'ект. І ёсць ніжэй за трэці метад, які, уласна, выконвае гэты код. Усё гэта з дапамогай JPA можна замяніць на адзін радок, які напісаны ніжэй. Яна робіць усё тое ж самае, - find All ByIdIn. Гэта значыць, па назве метаду ён генеруе вам SQL-запыт.

Вельмі зэбая штука. Я сам, калі не ведаў SQL, выкарыстоўваў JPA. Увогуле, звернеце ўвагу. Калі лянота вучыць SQL, - агонь. І, наогул, агонь!

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Spring. Хто чуў пра такую ​​штуку, як фрэймворк Spring? Бачыце, як вас многа? Нездарма. Spring ёсць у патрабаваннях кожнай другой вакансіі па бэкенду на Java. Без яго рэальна нікуды ў вялікай распрацоўцы. Што такое Spring? У першую чаргу гэта Dependency Injection-фрэймворк. Пра гэта таксама будзе расказваць наступны дакладчык. Але калі сцісла, гэта штука, якая дазваляе вам палегчыць імпартаванне залежнасцяў адных класаў на іншыя. Гэта значыць спрашчаецца веданне залежнасцяў.

Spring Boot - такі кавалак Spring, які дазваляе вам паднімаць сваё сервернае прыкладанне адной кнопкай. Вы заходзіце на THID, націскаеце пару кнопак, і вось у вас на localhost 8080 ужо паднята ваша сервернае прыкладанне. Гэта значыць, вы яшчэ ні радкі кода не напісалі, а яно ўжо працуе. Вельмі зэбая штука. Калі пішаце нешта сваё, - агонь!

Spring - вельмі вялікі фрэймворк. Ён не толькі паднімае вам сервернае прыкладанне і рэзавіт Dependency Injection. Ён дазваляе рабіць кучу за ўсё, у тым ліку ствараць REST API-метады. Гэта значыць, вы напісалі нейкі метад, павесілі на яго анатацыю Get mapping. І вось у вас на localhost ужо ёсць нейкі метад, які піша вам Hello world. Два радкі кода, і працуе. Стромкая штука.

Таксама Spring спрашчае напісанне тэстаў. Без тэсціравання ў вялікай распрацоўцы ніяк. Код трэба тэсціраваць. Для гэтага ў Java ёсць зэбая бібліятэка JUnit 5. І наогул JUnit, але апошняя версія пятая. Там ёсць усё для тэставання, усякія assertions і іншыя штукі.

І ёсць афігенны фрэймворк Mockito. Прадстаўце, што ў вас ёсць нейкая функцыянальнасць, якую вы жадаеце пратэставаць. Функцыянальнасць робіць шмат чаго, у тым ліку, дзесьці ў сярэдзінцы яна ўваходзіць ва «Укантакце» з вашым, напрыклад, айдзішнікам, і атрымлівае па айдышніку імя і прозвішча юзэра «Укантакце». Напэўна, вы не будзеце ў тэстах уваходзіць «Укантакце», гэта дзіўна. Але функцыянальнасць пратэставаць вам трэба, таму вы гэты клас, з дапамогай Mockito, зрабілі яго mok, яго імітацыю.

Вы скажаце, што калі ў гэты клас прыходзіць запыт з айдзішнікам вось такім, вяртае якое-небудзь прозвішча, напрыклад, Вася Пупкін. І гэта будзе працаваць. Гэта значыць, вы будзеце тэставаць усю функцыянальнасць за mok адзін нейкі клас. Вельмі зэбая штука.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Спасылка са слайду

Патэрны праектавання. Што гэта такое? Гэта шаблоны для вырашэння тыповых праблем, якія ўзнікаюць у распрацоўцы. У распрацоўцы часцяком узнікаюць аднолькавыя, ці падобныя нейкія задачы, якія было б выдатна неяк добра вырашаць. Таму людзі прыдумалі best practices, нейкія шаблёны, як вырашаць гэтыя праблемы.

Ёсць вэб-сайт з большасцю папулярных патэрнаў - refactoring.guru, можна пачытаць, даведацца, якія бываюць патэрны, прачытаць кучу тэорыі. Праблема ў тым, што гэта практычна бескарысна. Фактычна патэрны без практыкі асаблівай карысці не нясуць.

Вы пачуеце пра якія-небудзь патэрны тыпу Singletone ці Builder. Хто чуў гэтыя словы? Вельмі шмат людзей. Ёсць такія простыя патэрны, якія вы можаце рэалізаваць самі. Але большасць патэрнаў: стратэгія, фабрыка, фасад - не зразумела, дзе іх прымяняць.

І пакуль вы не ўбачыце на практыцы ў нейкім чужым кодзе месца, да якога ўжыты гэты патэрн, ужываць яго самім не атрымаецца. Таму з патэрнамі вельмі важная практыка. І проста прачытаць пра іх на refactoring.guru ня супер карысна, але гэта абавязкова трэба зрабіць.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Навошта патрэбныя патэрны? Няхай у вас ёсць нейкі клас User. У яго ёсць Id і Name. У кожнага User абавязкова павінен быць і Id, і Name. Злева зверху - клас.

Якія ёсць спосабы ініцыялізаваць User? Два варыянты – альбо канструктар, альбо setter. Якія ёсць мінусы ў абодвух падыходаў?

Канструктар. new User (7, "Bond"), окей. Цяпер дапусцім, што ў нас не клас User, а нейкі іншы, з сямю лічбавымі палямі. У вас будзе канструктар, у якім сем запар якія ідуць лікаў. Незразумела, што гэта за лікі, якое з іх да якога property адносіцца. Канструктар - гэта не выдатна.

Другі варыянт - setter. Вы дакладна пішаце: setId(7), setName(«Bond»). Вы разумееце, якая property да якога поля адносіцца. Але ў setter ёсць праблема. Па-першае, вы можаце забыцца наведаць нешта, а па-другое, ваш аб'ект атрымліваецца змяняным. Гэта не струменебяспечна і ледзь паніжае чытальнасць кода. Таму людзі прыдумалі клёвы патэрн - Builder.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Пра што гэта? Паспрабуем сабраць плюсы абодвух падыходаў - і setter, і канструктара - у адным. Які робіцца нейкі аб'ект, Builder, у якога таксама будуць палі Id і Name, які сам будзе будавацца на аснове setter, і ў якога будзе метад Build, які вяртае вам новага User са ўсімі параметрамі. У нас атрымліваецца нязменны аб'ект і setter. Клёва!

Якія ёсць праблемы? Вось у нас ёсць класічны Builder. Праблема - мы ўсё яшчэ можам забыцца наведаць нейкае поле. І калі мы забыліся наведаць айдышнік, у дадзеным выпадку ў Builder ён праініцыялізуецца банкрутам, таму што тып int – не nullable. І калі мы зробім Name "Bond" і забудзем наведаць айдышнік, у нас будзе новы User з id "0" і імем "Bond". Ня клёва.

Паспрабуем з гэтым пазмагацца. У Builder памяняем int на int жа, каб ен быў nullable. Цяпер усё выдатна.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Калі мы спрабуем зрабіць User з імем "Bond", забыўшыся праставіць яму айдышнік, у нас упадзе null pointer exception, таму што айдышнік не nullable, а ў Builder - null, канкрэтна pointer exception.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Але мы ўсё яшчэ можам забыцца паставіць імя, таму мы наважваем object replay на null. Цяпер, калі мы будуем з Builder наш аб'ект, ён правярае, што поле не nullable. І гэта яшчэ не ўсё.

Паглядзім на апошні прыклад. У дадзеным выпадку калі мы ў айдышным рантайме нейкім чынам паклалі null, і было б выдатна адразу даведацца, што ты гэта зрабіў і гэта не клёва, што ты зараз робіш памылку.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Трэба кінуць памылку не ў момант стварэння User, а калі ты наведаеш айдышнік null. Таму мы ў Builder памяняем у setter Integer на int, і ён адразу тут лаецца, што выкінулі null.

Карацей, у чым сутнасць? Ёсць найпросты патэрн Builder, але нават у яго рэалізацыі ёсць нейкія тонкасці, таму вельмі клёва паглядзець на розныя рэалізацыі патэрнаў. У кожнага патэрна ёсць дзясяткі рэалізацый. Гэта ўсё вельмі цікава.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Як мы пішам Builder у прадакшэн-кодзе? Вось наш User. На яго вешаем ратацыю Builder з бібліятэкі Lombok, і яна сама генеруе нам Builder. Гэта значыць, мы не пішам кода, але Java ужо лічыць, што ў гэтага класа ёсць Builder, і мы яго можам вось так выклікаць.

Я ўжо казаў, што ў Java ёсць бібліятэкі практычна для ўсяго, у тым ліку Lombok, зэбая бібліятэка, якая дазваляе вам не пісаць boilerplate. Builder, GET.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Патэрны бываюць архітэктурныя - якія адносяцца не толькі да аднаго класа, а да сістэмы ў цэлым. Ёсць такі клёвы прынцып у праектаванні сістэм: Single Responsibility Principle. Пра што ён гаворыць? Аб тым, што кожны клас павінен адказваць за нейкую сваю функцыянальнасць. У дадзеным выпадку ў нас ёсць Controller, які мае зносіны з карыстальнікамі, JSON-аб'ектамі. Ёсць Facade, які пераўтворыць JSON-аб'екты ў мадэлі, з якімі далей будзе працаваць Java дадатак. Ёсць Service, у якім ёсць складаная логіка, якая працуе з гэтымі мадэлямі. Ёсць Data Access Object, якая гэтыя мадэлі кладзе ў базу і дастае з базы. І ёсць сама база даных. Іншымі словамі, не ўсё гэта знаходзіцца ў адным класе, а мы робім пяць розных класаў, і гэта яшчэ адзін патэрн.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Калі вы больш-менш вывучылі Java, выдатна напісаць які-небудзь уласны праект, у якім будзе база дадзеных, праца з іншымі API, і які будзе даваць REST API-кліентам ваша сервернае прыкладанне. Такую штуку будзе выдатна ўставіць у рэзюмэ, гэта клёвы канчатак вашага навучання. З гэтым можна ісці і ўладкоўвацца на працу.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

Вось прыклад майго сервернага дадатку. На другім курсе я з хлопцамі пісаў курсавую працу. Яны пісалі мабільнае прыкладанне для арганізацыі мерапрыемстваў. Там карыстальнікі маглі заходзіць праз «УКантакце», ставіць на карце кропкі, ствараць мерапрыемствы, клікаць на іх сваіх сяброў, захоўваць выяву мерапрыемстваў і г.д.

Што зрабіў у праекце я? Напісаў сервернае дадатак на Spring Boot, не выкарыстоўваючы SQL. Я яго не ведаў, выкарыстоўваў JPA. Што яно ўмела рабіць? Аўтарызавацца ў VK праз OAuth-2. Браць токен карыстальніка, ісці з ім у VK, правяраць, што гэта сапраўдны карыстач. Атрымліваць інфармацыю аб карыстальніках праз «УКантакце». Яно ўмела захоўваць інфармацыю ў базе даных, таксама праз JPA. Умела захоўваць карцінкі і іншыя файлы ў памяці кампутара, і захоўваць спасылкі на іх у базе. Я тады яшчэ ня ведаў, што ёсьць CLOB-аб'екты ў базе, таму рабіў так. Там быў REST API для карыстальнікаў, кліенцкіх прыкладанняў. І былі юніт-тэсты на асноўныя функцыянальнасці.

[…] Невялікі прыклад майго паспяховага вывучэння Java. На першым курсе ва ўніверсітэце мне выкладалі C# і далечы разуменне пра ООП-праграмаванне — што такое класы, інтэрфейсы, абстракцыя, навошта яны патрэбныя. Гэта мне вельмі дапамагло. Без гэтага вывучаць Java даволі складана, незразумела, навошта патрэбны класы.

Навошта вучыць Java і як рабіць гэта эфэктыўна. Даклад Яндэкса

На другім курсе ва ўніверсітэце зноў жа давалі Java core, але я на гэтым не спыніўся, пайшоў вывучаць Spring сам і напісаў курсавую працу, свой праект, аб якім я казаў вышэй. І з гэтым усім я пайшоў на стажыроўку ў Яндэкс, прайшоў сумоўе, патрапіў у Яндэкс.Маркет. Там я пісаў бэкэнд для Бэру, гэта наш маркетплейс, і для самога Яндэкс.Маркета.

Пасля гэтага, паўгода таму, я перавёўся ў іншую каманду ўнутры таго ж Маркета. Мы робім аналітыку для бізнес-партнёраў. Мы ў аналітычнай платформе, нас на бэкендзе трое, таму ў мяне вельмі вялікая доля ўплыву на праект. Гэта вельмі цікава, насамрэч. Гэта значыць, мы рэальна прадстаўляем дадзеныя па рынку - якія продажу, у якіх катэгорыях, у якіх мадэлях, для бізнес-партнёраў, вялікіх вядомых кампаній. І нас усяго трое, мы пішам гэты код, і гэта вельмі прыкольна.

Дзякуй! Карысныя спасылкі:
- "Java 8. Кіраўніцтва для пачаткоўцаў".
- Структуры даных.
- SQLZOO.
- Нармалізацыя баз даных.
- Патэрны праектавання.
- Design Patterns.
- Чысты код.
- Эфектыўная Java.

Крыніца: habr.com

Дадаць каментар