JavaRush /Java Blog /Random-TL /Sino ang isang Software Engineer? Software engineering VS...

Sino ang isang Software Engineer? Software engineering VS "lamang" programming

Nai-publish sa grupo
Ibinibigay namin sa iyo ang isang adaptasyon ng isang artikulo ni Samer Buna tungkol sa mga pagkakaiba sa pagitan ng software engineering at programming, o kung paano naiiba ang pagbuo ng konsepto ng software sa "pag-coding lang."
Sino ang isang Software Engineer?  Software Engineering VS
Ang lahat ng software engineer ay maaaring mag-code, ngunit hindi lahat ng programmer ay maaaring bumuo ng mga konsepto ng software. Ang ilang mga tao ay hindi gusto ang terminong "Software Engineer" (aka Software Engineer) dahil kadalasang ginagamit namin ang salitang "engineer" kapag pinag-uusapan ang isang bagay na mas pisikal - construction, halimbawa. Ang aming artikulo, siyempre, ay hindi tungkol sa termino mismo. Kung bigla itong magdulot sa iyo ng pagtanggi, madali itong mapapalitan ng isang bagay na may kaugnayan sa pagkamalikhain. "Software Creator", "Software Author"... o kahit na "Software Creator"!
Kapag pinag-uusapan natin ang tungkol sa isang "inhinyero ng software," ang ibig nating sabihin ay isang tao na ang pangunahing gawain ay hindi lamang pagsusulat ng code, ngunit paglikha ng isang de-kalidad na aplikasyon. At dito nakikita niya ang kanyang pagtawag, paglalapat ng siyentipikong diskarte at istatistikal na pamamaraan sa kanyang trabaho. Para sa kanya, ang programming ay hindi lang paraan para kumita ng pera para sa pagkain.
Ang kakayahang magprograma ay hindi awtomatikong ginagawang isang software engineer ang isang tao. Kahit sino ay maaaring matutong mag-code, at ito ay mas madali kaysa sa tila. Kahit sino ay maaaring lumikha ng isang simpleng programa para sa kanilang sariling paggamit, ngunit hindi nito ginagarantiyahan na ang parehong programa ay gagana para sa iba. Ang paborito kong halimbawa ay ito: marami sa atin ang kumanta sa shower, ngunit, sayang, ang pagganap na ito ay hindi palaging karapat-dapat sa isang propesyonal na yugto. Siyempre, para sa isang de-kalidad na karanasan sa musika, malamang na ikaw ay magiging isang propesyonal. Kailangan mo ba ng higit pang mga halimbawa?
  • Lahat tayo ay natututo ng matematika at pagsusulat sa paaralan, ngunit hindi tayo nagiging mathematician at manunulat.
  • Karamihan sa atin ay may kakayahang maghanda ng masasarap at kung minsan ay napakasarap na ulam, ngunit hindi lahat ay maglakas-loob na magluto ng mesa para sa 100 katao para sa isang embassy dinner party. Sa kasong ito, umarkila kami ng kusinero.
  • Handa ka na ba ngayon na ganap na ipagkatiwala ang pagtatayo ng iyong bagong bahay sa anak ng kapitbahay na lumikha ng mga kahanga-hangang obra maestra mula sa Lego?
Ang aking pangunahing punto na sinusubukan kong ipahiwatig sa artikulong ito ay ang mga simpleng programa ay ibang-iba sa mga programang dinisenyo ng mga inhinyero. Ang pinakasimpleng kahulugan ng proseso ng programming: pagguhit ng isang nakaayos na pagkakasunud-sunod ng mga aksyon para sa isang computer upang makakuha ng isang bagay na tiyak bilang isang output, na ibinigay na ibinigay na mga parameter ng input. Ang proseso ng software engineering ay ang disenyo, pagsulat, pagsubok, at curation ng isang computer program upang malutas ang mga problema para sa maraming user. Ito ay tungkol sa paglikha ng maaasahan at secure na mga solusyon na tatagal sa pagsubok ng oras at gagana para sa ilang posibleng hindi kilalang mga hamon na lampas sa nakikita.
Sino ang isang Software Engineer?  Software Engineering VS
Alam ng mga inhinyero ng software ang lahat tungkol sa mga problemang nilulutas nila, ang mga solusyong iminumungkahi nila, ang mga limitasyon ng mga solusyong iyon, ang kanilang privacy at seguridad. Sa palagay ko, kung ang isang tao ay hindi nauunawaan ang kakanyahan ng problema, hindi niya dapat simulan ang pag-program ng solusyon nito.

Mindset ng engineering - maghanap ng mga inilapat na solusyon

Ang mga inhinyero ng software ay hindi isinasaalang-alang ang pagsulat ng software para sa kanilang pangunahing layunin. Nag-iisip sila sa mga tuntunin ng pagtugon sa mga pangangailangan at paglutas ng mga problema . Mahalaga ito dahil hindi lahat ng problema ay nangangailangan ng solusyon sa software. Ang ilan sa mga ito ay maaaring harapin gamit ang mga umiiral na programa. Ang paglitaw ng ilang mga problema ay maaaring mahulaan nang maaga, at sa tulong ng karampatang disenyo ng programa, maiiwasan ang mga ito sa hinaharap.

"Ang mga intelektwal ay lumulutas ng mga problema, pinipigilan sila ng mga henyo"

- Albert Einstein

Sino ang isang Software Engineer?  Software Engineering VS
Ang mga kumplikadong problema ay madalas na nangangailangan ng pagsulat ng maraming mga programa. May mga gawain na nangangailangan ng parallel running applications, habang ang iba ay nangangailangan ng sunud-sunod na pagpapatupad ng ilang mga program. Ang ilang mga problema ay maaaring malutas sa pamamagitan lamang ng pagsasanay sa mga gumagamit. Bago magsimulang lumikha ng isang programa, ang isang software engineer ay nagtatanong sa kanyang sarili ng ilang mga katanungan:
  • Anong mga problema ang dapat kong lutasin?
  • Ano pa ang maaari mong gawin maliban sa pagsulat ng code upang malutas ang mga ito?
  • Ano ang maaari kong gawin upang gawing mas madali ang mga gawaing ito gamit ang app?

Kalidad ng programa at kalidad ng code

Ang mga magagandang programa ay malinaw at nababasa. Ang mga ito ay madaling i-extend, mahusay na maglaro sa iba pang mga programa, at hindi magiging isang bangungot na magtrabaho kasama. Hindi mapag-usapan ang kalidad ng code. Dapat mataas, yun lang. Kung isasaalang-alang ito, hindi katanggap-tanggap ang mga dahilan tulad ng masamang mood ng coder o masyadong mahigpit na mga deadline (oh, ang mga deadline na iyon!). Isa sa pinakamahalagang aspeto ng software development ay ang pagdidisenyo ng program sa paraang madaling mapanatili at mabago sa hinaharap (hello, OOP!). Ngayon, halos lahat ng software ay nababago, kadalasan ang prosesong ito ay nangyayari kahit na walang partisipasyon ng user o hindi nangangailangan ng anuman mula sa user maliban sa "na-update ang iyong programa, i-click ang OK o Ipagpaliban." Siyempre, may karapatan ang mga user na humiling ng mga bagong feature mula sa mga application (lalo na kung pinag-uusapan natin ang tungkol sa matagal nang enterprise software na nakasulat sa Java, o mga online na laro na maaaring laruin nang maraming taon).
Nais malaman ang higit pa tungkol sa Java programming? Sumali sa Java Developer group !
Ang isang piraso ng code sa kanyang sarili ay halos hindi matatawag na kapaki-pakinabang. Ang kapaki-pakinabang na pag-andar ng software ay nagsisimula kung saan ang magkakaibang piraso ng mga application ay nakikipag-usap sa isa't isa, nagpapalitan ng data, at nagtutulungan upang maisagawa ang gawain ng pagpapakita ng data at mga interface sa mga user.
Sino ang isang Software Engineer?  Software Engineering VS
Dapat na idinisenyo ang mga programa na nasa isip ang mga puntong ito! Anong mga mensahe ang kanilang natatanggap? Anong mga kaganapan ang sinusubaybayan? Paano nangyayari ang pagpapatunay at awtorisasyon? Ang isa pang pantay na mahalagang tanda ng isang mahusay na programa ay ang kalinawan ng code, hindi ang bilang ng mga pagsubok na naipasa ng aplikasyon o kahit na mahusay na saklaw ng pagsubok. Tila simpleng mga tanong: "Maiintindihan ba ng iba maliban sa akin ang aking code?", "Magagawa ko bang isulat ang code na ito ngayon at mauunawaan ito sa loob ng ilang linggo?" Ang isang tanyag na quote tungkol sa dalawang pinakamahirap na bagay sa programming ay nagsasabi:

"Mayroong dalawang talagang mahirap na bagay: cache invalidation at entity name"

— Phil Carlton.

Ang pagiging madaling mabasa ng code ay mas mahalaga kaysa sa karaniwang pinaniniwalaan. Sa kasamaang palad, hindi posibleng tukuyin ang mga tumpak na sukatan o parameter para sa kalinawan ng code. Ang pagsasaulo ng karaniwang tinatanggap na mga pamantayan ng wika, mahusay na mga modelo ng software, at mga paraan ng pagbuo ay makakatulong sa bahagi. Ngunit kadalasan ito ay hindi sapat. Sa oras at karanasan, ang mga tunay na propesyonal ay nagkakaroon, wika nga, ng isang "kalinawan," isang bagay na katulad ng intuwisyon. Ang isang metapora sa pagsulat ay mahusay na gumagana dito: ang pag-alam ng maraming salita ay hindi makakatulong sa iyo na magsulat ng isang bagay na maikli at malinaw ang kahulugan.

"Isusulat ko sana ito nang mas maikli, ngunit wala akong oras."

- Mark Twain.

Ang kakayahang ayusin ang mga bug nang mabilis at madali ay isang pangunahing tampok ng mahusay na software. Ang mga error sa programa ay dapat magpadala ng mga malinaw na mensahe at naka-center na naka-log para sa pagsubaybay. Kapag may naiulat na bagong error, dapat may kakayahan ang taong mag-aayos nito na i-debug ito. Kailangan niyang madaling kumonekta sa system, ma-access ang impormasyon ng pagpapatupad anumang oras, at madali ring masuri ang functionality ng anumang bahagi ng system.

Mga kapaligiran at pagsubok

Kapag ang mga software engineer ay bumuo ng mga application, ginagawa nila ang kanilang makakaya upang matiyak na gumagana ang mga ito sa mga computer ng iba't ibang mga arkitektura at may iba't ibang mga operating system. Mahalaga na ang software ay gumagana sa iba't ibang mga resolution at mga oryentasyon ng screen, at gayundin na hindi ito "kumakain" ng mas maraming memorya at kapangyarihan sa pagproseso kaysa sa kinakailangan.
Sino ang isang Software Engineer?  Software Engineering VS
Pagdating sa mga web application, dapat gumana ang mga ito sa lahat ng pangunahing browser. Kapag gumagawa ng desktop application, kailangan mong tiyakin na ito ay inilulunsad at gumagana nang tama sa Mac, Windows, at Linux. Buweno, ang programa ay nakasalalay sa data, kung gayon ang application ay dapat gumana kahit na sa kaso ng isang mabagal na koneksyon ng data o kawalan nito. Upang magsulat ng isang piraso ng software, pinag-iisipan ng mga inhinyero ang lahat ng uri ng mga opsyon sa senaryo at planong subukan ang mga ito. Nagsisimula ang lahat sa pagpili ng perpektong opsyon, kung saan gumagana ang lahat nang walang mga pagkakamali. Pagkatapos ay idokumento nila ang anumang mga potensyal na problema at isulat ang mga ito sa plano ng pagsubok. Nagsisimula ang ilang mga inhinyero sa pamamagitan ng pagsusulat ng code, na tinatawag nilang test case, na ginagaya ang mga sitwasyon para sa lahat ng posibleng problema at error. At pagkatapos ay nakasulat ang isang programa na maaaring gumana sa alinman sa mga opsyon na isinasaalang-alang. Ang natatanging kakayahan ng isang mahuhusay na software engineer ay hindi alam kung paano magsulat ng code, ngunit ang pag-unawa kung ano ang eksaktong dapat gawin ng application bilang isang output at kung paano ito makamit. Kapag ang mga kinakailangan sa software ng customer ay hindi kumpleto at posibleng malabo, kailangang suriin at “maunawaan” ng engineer nang tama ang mga ito.

Gastos at kahusayan

Maaaring ayusin ng isang software engineer ang problema nang mabilis sa karamihan ng mga kaso. Kung sa tingin mo ang pagkuha ng isang "mahal" na karanasang programmer ay magpapalaki sa iyong mga gastos, isipin muli. Kung mas may karanasan ang upahang programmer, mas mabilis siyang makakapagbigay ng simple, maayos, maaasahan at madaling gamitin na solusyon. Sa katagalan, tiyak na mababawasan nito ang mga gastos sa pagbuo ng software.
Sino ang isang Software Engineer?  Software Engineering VS
Kinakailangan din na isaalang-alang ang mga gastos sa pagsasagawa ng programa. Ang anumang programa ay gumagamit ng mga mapagkukunan ng computing, at hindi sila libre.
Ang trabaho ng Software Engineer ay magsulat ng mahusay na code na hindi gumagamit ng mga mapagkukunan sa pag-compute nang hindi kinakailangan.
Halimbawa, ang pag-cache ng madalas na na-access na data ay isa sa mga posibleng diskarte na ginagamit upang makamit ang ninanais na resulta. Ngunit isa lamang ito sa malamang na daan-daang mga tool at solusyon na maaaring gawing mas mabilis at mas mahusay ang isang programa. Ang isang baguhang programmer ay maaaring magbigay sa iyo ng murang solusyon, ngunit ang paggamit ng ganoong solusyon sa huli ay magdudulot sa iyo at sa iyong mga kliyente ng higit pa kaysa kung nagtrabaho ka sa isang may karanasang developer na lumikha ng isang epektibong solusyon sa simula pa lang.

Tumutok sa karanasan ng gumagamit

Ang isang mahusay na programmer ay bubuo nang nasa isip ang Karanasan ng Gumagamit (UX). Ang pakikipag-ugnayan ng tao-machine ay isang paksa na may walang katapusang pananaliksik at solusyon. Ang mas maraming mga solusyon ay inilapat, ang mas mahusay na ang programa ay dapat na lumabas. Narito ang ilang halimbawa, para lang madama mo kung ano ang direksyong ito:
  • Kapag nagdidisenyo ng mga form sa pagpasok ng data tulad ng e-mail, ang isang mahusay na programa ay dapat na huwag pansinin ang kaso ng e-mail address. Hindi ito dapat magdulot ng error kung pinindot ang CAPSLOCK key dahil ang email address ay natatangi sa lowercase. Kung tumatanggap ang program ng bagong email address bilang input, suriin ito nang maaga sa proseso ng pag-input upang alertuhan ang user na ginagamit nila ang maling format ng address. Kasama sa solusyon na ito ang parehong mga halatang check tulad ng nawawalang “@” sign, at hindi masyadong halata, gaya ng pagsuri para sa maling pagkakasunod-sunod ng mga character tulad ng “gmail.ocm”

  • Kapag na-redirect ang user upang magsagawa ng ilang aksyon, dapat tandaan ng isang mahusay na programa ang kanyang kasalukuyang posisyon at ibalik siya pagkatapos niyang matapos. Ang isang mahusay na programa ay dapat ding tandaan ang data na naipadala na ng gumagamit, na mahalaga para sa karagdagang pakikipag-ugnayan sa kanya.

    Sabihin nating naghahanap ka ng paglalakbay sa himpapawid bilang Bisita sa Expedia. Sa ibang pagkakataon, nagpasya kang gumawa ng account. Dapat na i-save ng app ang lahat ng iyong nakaraang paghahanap sa bagong account at dapat mong ma-access ang mga ito mula sa iba pang mga device.


  • Sino ang isang Software Engineer?  Software Engineering VS
  • Ang isang mahusay na programa ay idinisenyo na nasa isip ang mga sitwasyon ng gawi ng user. Hindi mo lang kailangan na magdagdag ng mga bagong feature sa "so-so" na batayan; ilagay ang iyong sarili sa posisyon ng user. Isang araw nagbu-book ako ng mga ticket sa eroplano at nakalimutan kong isama ang aking frequent flyer number. Matapos matanggap ang kumpirmasyon, nagpasya akong pumunta sa website ng airline at idagdag ito para makuha ang diskwento. Upang malaman kung paano ito gagawin, kinalikot ko ang site sa loob ng 10 minuto. Ang application ay hindi halata na ako ay gumagala nang walang layunin sa iba't ibang mga pahina ng site upang mahanap kung ano ang kailangan ko. Nang maglaon, natuklasan ko na nakarating na ako sa tamang pahina ng ilang beses, ngunit hindi ko ito naintindihan, dahil ang field na kailangan ko ay nawala sa iba pang katulad na mga field ng napakalaking anyo.

    Ito ay lumabas na upang ma-edit ang impormasyon sa paglalakbay, kailangan kong mag-scroll sa halos dalawampung linya ng form, ipasok ang numero ng loyalty card at numero ng telepono, kung wala ito ay hindi maipadala ang form para sa pag-verify. Ito ay isang halimbawa ng isang programa na binuo nang hindi iniisip kung gaano magiging komportable ang gumagamit dito.

Pagiging maaasahan, seguridad at kaligtasan

Sa palagay ko, ang pinakamahalagang pagkakaiba sa pagitan ng isang propesyonal na developer ng software at isang baguhan ay isinasaalang-alang ang mga parameter tulad ng pagiging maaasahan, seguridad at kaligtasan ng application kapag nilikha ito.
Alam ng isang tunay na propesyonal na responsable siya para sa kaligtasan at seguridad ng kanyang solusyon.
Ang mga bahagi ng programa ay dapat na mapagparaya sa maling input, maling estado, at maling pakikipag-ugnayan. Ito ay talagang napakahirap ipatupad at ang pangunahing dahilan kung bakit nakakarinig tayo ng mga kuwento ng mga taong namamatay dahil sa mga bug sa software. Ang mga gumagamit ay pumasok, pumapasok at magpapatuloy na magpasok ng maling data sa programa. Dapat itong tanggapin bilang isang katotohanan. Bukod dito, gagawin ito ng ilan sa layunin, na may layuning masira ang aplikasyon at makuha ang mga mapagkukunang magagamit nito.
Sino ang isang Software Engineer?  Software Engineering VS
Narito ang isang halimbawa sa totoong buhay: Ang taong pinaghihinalaang responsable para sa kamakailang paglabag sa data ng Equifax ay inakusahan ng hindi pagtupad sa kanyang mga responsibilidad sa trabaho, na bumuo ng mga solusyon upang labanan ang masama at malisyosong input sa lahat ng produkto ng software na ginawang available sa publiko. Ang mga insidente na nauugnay sa seguridad ng impormasyon ay hindi lamang nagsasangkot ng mali at malisyosong input, kundi pati na rin ang maling naipasok na data. Kung nakalimutan ng isang user ang kanyang password, ilang beses niya kayang subukang ipasok ito? Haharangin mo ba siya pagkatapos nito? Paano kung may ibang sumubok na i-block ang kanyang account? Maaari bang ipadala ng isang user ang kanilang mga kredensyal sa isang hindi naka-encrypt na channel ng data? Paano kung ang kahilingan sa pag-login ay nagmula sa hindi pangkaraniwang lokasyon? Ano ang iyong gagawin kung ang pagtatangka sa pag-login ay mukhang awtomatiko? Ano ang ginawa mo upang protektahan ang iyong mga user mula sa cross-site na scripting, cross-site na pamemeke sa kahilingan at karaniwang phishing? Mayroon ka bang backup na diskarte sa kaso ng pag-atake ng DDoS sa iyong mga server? Itinatampok ng mga tanong na ito ang ilan lamang sa mga isyu na kailangang isaalang-alang. Ang protektadong programa ay hindi nagse-save ng mahalagang impormasyon sa text form. Pinoprotektahan ito ng isang kumplikadong one-way cipher (isa na madaling i-encrypt ngunit halos imposibleng i-decrypt nang walang susi). Ito ay mga backup na hakbang kung sakaling ma-hack ang program. Matutuklasan ng mga hacker ang naka-encrypt na data na walang silbi sa kanila. Ang mga hindi inaasahang problema ay lumitaw kahit na sa pinakamahusay na mga programa. Ang isang programmer na hindi handa para sa kanilang paglitaw ay halos hindi matatawag na isang propesyonal. Hanggang sa inaasahan niya ang hindi inaasahang pag-uugali, hindi siya isang engineer. Siya ang "may-akda ng mga hindi ligtas na programa." Ang mga error sa mga programa ay hindi palaging halata. Limitado ang aming intelektwal na kakayahan na mauna at maiwasan ang mga kilalang pagkakamali. Ito ang dahilan kung bakit nauunawaan ng mga inhinyero ng software ang kahalagahan ng mahuhusay na tool para makapagsulat sila ng tama at secure na software.

Mga Kinakailangang Tool

Walang alinlangan na kailangan natin ng iba't ibang mga tool sa pag-unlad. Ang kanilang tungkulin ay madalas na minamaliit, ngunit sa katunayan sila ay nakakatipid ng maraming oras at pagsisikap, na pinapasimple ang ilang mga gawain sa pamamagitan ng isang pagkakasunud-sunod ng magnitude. Isipin kung kailangan mo pa ring mag-upload ng mga file sa pamamagitan ng FTP para sa pag-deploy, kumbaga, ang lumang paraan. Isipin ang pag-debug ng network at mga isyu sa pagganap nang walang Chrome DevTools! At gaano ka-inefficient ang pagsulat ng JavaScript code nang walang ESlit at Prettier sa mga araw na ito!
Sino ang isang Software Engineer?  Software Engineering VS
Anumang tool na binabawasan ang oras ng feedback habang nagsusulat ka ng code ay dapat na malugod. Kapag nakakita ako ng isang tool na dati ay hindi pamilyar sa akin, ngunit talagang kapaki-pakinabang at epektibo, maaari ko lamang pagsisihan na hindi ko ito ginamit bago ang masayang sandaling iyon.
Ang mas mahusay at mas modernong mga tool ay makakatulong sa iyong maging isang mas mahusay na programmer. Hanapin ang mga ito, gamitin ang mga ito, pahalagahan ang mga ito, at kung magagawa mo, pagbutihin ang mga ito. At huwag mabitin sa parehong bagay: sino ang nakakaalam, marahil sa isang bagong tool ay gugugol ka ng oras sa pag-install at pag-aaral nang isang beses, at pagkatapos ay malulutas mo ang mga problema nang maraming beses nang mas mabilis?

Ang ebolusyon ng software engineering

Walang sinuman ang maaaring matuto ng software engineering sa loob ng dalawang buwan, anim na buwan, o kahit isang taon. Hindi ka tuturuan kung paano maging isang software engineer sa isang kurso, unibersidad, o boot camp. Nag-aaral ako sa nakalipas na dalawampung taon at patuloy na nag-aaral ngayon. Nagawa kong kumportable na tawagin ang aking sarili bilang isang bihasang programmer pagkatapos lamang ng isang dekada ng pag-aaral at pagbuo, paglikha at pagpapanatili ng mga application na ginagamit ng libu-libong mga gumagamit. Ang software engineering ay hindi para sa lahat, ngunit dapat matutunan ng lahat na lutasin ang kanilang mga problema gamit ang isang computer. Kung matututo kang magsulat ng mga simpleng programa, dapat. Kung matututo kang gumamit ng software na magagamit sa publiko, dapat. Kung matututo kang gumamit ng open source software at i-customize ito para sa iyong sarili, mayroon kang superpower! Araw-araw ay nagdadala sa mga developer ng mga bagong hamon, mga bagong problema, kaya naman kailangan ang software engineering. Ang pangunahing gawain ng propesyon na ito ay lumikha ng software upang ang isang ordinaryong tao ay hindi kailangang harapin ito sa loob ng maraming taon. Upang hindi na kailangan ng mahabang pag-aaral para makipag-ugnayan sa mga programa. Gayunpaman, ang mga inhinyero ng software ay patuloy na nag-iisip tungkol sa paglikha ng mas mahusay na mga tool na maaaring malutas ang mas kumplikadong mga kilalang problema, at ginagawa ang lahat ng posible upang matiyak na ang mga bagong problema ay lilitaw nang bihira hangga't maaari.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION