Aiwatar da bincike a tsaye a cikin tsari, maimakon neman kwari tare da shi

An yi min wahayi don rubuta wannan labarin ta hanyar adadi mai yawa na kayan bincike a tsaye waɗanda ke ƙara zuwa gaba ɗaya. Na farko, wannan PVS-studio blog, wanda ke haɓaka kanta a kan Habré tare da sake duba kurakuran da aka samo ta kayan aikin su a cikin ayyukan buɗe ido. An aiwatar da PVS-studio kwanan nan Taimakon Java, kuma, ba shakka, masu haɓaka IntelliJ IDEA, wanda ginannen na'urar nazari mai yiwuwa shine mafi ci gaba ga Java a yau, ya kasa nisa.

Lokacin karanta irin waɗannan sake dubawa, mutum yana jin cewa muna magana game da elixir na sihiri: danna maɓallin, kuma a nan shi ne - jerin lahani a gaban idanunku. Da alama kamar yadda masu nazarin suka inganta, za a sami ƙarin kwari kai tsaye, kuma samfuran da waɗannan mutummutumin ke bincika za su zama mafi kyau kuma mafi kyau, ba tare da wani yunƙuri daga ɓangarenmu ba.

Amma babu sihiri elixirs. Ina so in yi magana game da abin da yawanci ba a tattauna a cikin posts kamar "a nan ne abubuwan da robot ɗinmu zai iya samu": abin da masu nazari ba za su iya yi ba, menene ainihin rawar da matsayi a cikin tsarin isar da software, da kuma yadda za a aiwatar da su daidai.

Aiwatar da bincike a tsaye a cikin tsari, maimakon neman kwari tare da shi
Ratchet (source: wikipedia).

Abin da Static Analyzers ba za su iya yi ba

Menene, daga mahimmin ra'ayi, nazarin lambar tushe? Muna ciyarwa a wasu kafofin, kuma a cikin ɗan gajeren lokaci (ya fi guntu fiye da gwajin gudu) muna samun wasu bayanai game da tsarin mu. Mahimmin ƙayyadaddun ƙayyadaddun lissafi da ƙima shine don haka za mu iya samun ƙunƙun nau'in bayanai kawai.

Shahararriyar misalin matsalar da ba za a iya warware ta ta hanyar bincike na tsaye ba shine dakatar da matsala: wannan ka'ida ce da ke tabbatar da cewa ba shi yiwuwa a ƙirƙira babban algorithm wanda zai ƙayyade daga lambar tushe na shirin ko zai madauki ko ƙare a cikin ƙayyadadden lokaci. Tsawaita wannan ka'idar shine Rice's theorem, wanda ya bayyana cewa ga duk wani abu maras muhimmanci na ayyukan ƙididdigewa, ƙayyadaddun ko shirin na sabani yana kimanta aiki tare da irin wannan dukiya matsala ce ta algorithmically wanda ba za a iya warwarewa ba. Alal misali, ba shi yiwuwa a rubuta mai nazari wanda zai iya ƙayyade daga kowane lambar tushe ko shirin da aka bincika shine aiwatar da wani algorithm wanda ke ƙididdigewa, a ce, squaring lamba.

Don haka, ayyukan masu nazari na tsaye suna da iyakoki mara iyaka. Mai nazari a tsaye ba zai taɓa iya tantancewa a cikin kowane yanayi kamar, alal misali, faruwar "bangaren null pointer" a cikin yarukan da ba za a iya warware su ba, ko kuma a kowane yanayi don sanin abin da ya faru na "sifa ba a samo" a cikin harsuna tare da bugawa mai ƙarfi. Duk abin da mafi ci gaba a tsaye analyzer zai iya yi shi ne haskaka lokuta na musamman, adadin wanda, daga cikin duk yiwuwar matsaloli tare da lambar tushe, shi ne, ba tare da ƙari, digo a cikin teku.

Binciken a tsaye ba shine neman kwari ba

Ƙarshen yana zuwa daga abin da ke sama: bincike na tsaye ba hanya ce ta rage yawan lahani a cikin shirin ba. Zan yi ƙoƙari in faɗi cewa lokacin da aka fara amfani da aikin ku, zai sami wuraren "mai daɗi" a cikin lambar, amma, mai yiwuwa, ba zai sami lahani da ke shafar ingancin shirin ku ba.

Misalai na lahani da masu bincike suka samu ta atomatik suna da ban sha'awa, amma kada mu manta cewa an samo waɗannan misalan ta hanyar bincika babban saiti na codebases. Ta irin wannan ka'ida, masu fashe waɗanda ke iya gwada kalmomin sirri masu sauƙi a kan adadi mai yawa na asusu a ƙarshe suna samun waɗannan asusun waɗanda ke da kalmar sirri mai sauƙi.

Shin hakan yana nufin bai kamata a yi amfani da bincike na tsaye ba? Tabbas ba haka bane! Kuma daidai wannan dalilin da ya sa yana da daraja duba kowane sabon kalmar sirri don shiga cikin jerin tasha na kalmomin shiga "sauki".

Bincike a tsaye ya fi gano kwari

A haƙiƙa, matsalolin da a zahiri ana warware su ta hanyar bincike sun fi girma. Bayan haka, gabaɗaya, bincike a tsaye shine duk wani bincike na lambobin tushe da aka aiwatar kafin a ƙaddamar da su. Ga wasu abubuwa da za ku iya yi:

  • Duba salon coding a cikin mafi faɗin ma'anar kalmar. Wannan ya haɗa da duka tsarawa da kuma neman amfani da fanko/karin bakan gizo, saita ƙira akan ma'auni kamar adadin layuka / rikitaccen hanyar cyclomatic, da sauransu - duk abin da zai iya sa lambar ta zama abin karantawa da kiyayewa. A cikin Java wannan kayan aikin shine Checkstyle, a Python flake8 ne. Shirye-shiryen wannan ajin yawanci ana kiransu "linters".
  • Ba kawai lambar aiwatarwa ba za a iya yin nazari. Fayilolin albarkatun kamar JSON, YAML, XML, .Properties na iya (kuma ya kamata!) Za a bincika ta atomatik don inganci. Shin bai fi kyau a gano cewa saboda wasu maganganun da ba a haɗa ba tsarin JSON ya karye a farkon matakin tabbatar da Buƙatar Buƙatar Pull ta atomatik fiye da lokacin aiwatar da gwaje-gwaje ko a lokacin Run? Akwai kayan aikin da suka dace: misali, YAMLlint, JSONLint.
  • Tari (ko tantancewa don harsunan shirye-shirye masu ƙarfi) kuma wani nau'in bincike ne na tsaye. A matsayinka na mai mulki, masu tarawa suna iya ba da gargaɗin da ke nuna matsaloli tare da ingancin lambar tushe, kuma bai kamata a yi watsi da su ba.
  • Wani lokaci harhada ba kawai game da haɗa lambar da za a iya aiwatarwa ba ne. Misali, idan kuna da takardu a cikin tsari AsciiDoctor, sannan a lokacin da ta canza zuwa HTML/PDF mai kula da AsciiDoctor (maven plugin) na iya ba da gargaɗi, misali, game da karyewar hanyoyin haɗin ciki. Kuma wannan kyakkyawan dalili ne don kar a karɓi Buƙatun Ja tare da canje-canjen takardu.
  • Duba haruffa kuma nau'in bincike ne a tsaye. Amfani aspell yana iya duba rubutun ba kawai a cikin takaddun ba, har ma a cikin lambobin tushen shirye-shirye ( sharhi da kuma a zahiri) a cikin harsunan shirye-shirye daban-daban, gami da C/C++, Java da Python. Kuskuren rubutu a cikin mahallin mai amfani ko takaddun ma lahani ne!
  • Gwajin daidaitawa (don menene, duba wannan и wannan rahotanni), kodayake ana aiwatar da su a cikin lokacin gwajin naúrar kamar pytest, a zahiri su ma wani nau'in bincike ne, tunda ba sa aiwatar da lambobin tushe yayin aiwatar da su.

Kamar yadda kuke gani, gano kwari a cikin wannan jeri yana ɗaukar mafi ƙarancin muhimmiyar rawa, kuma komai yana samuwa ta hanyar amfani da kayan aikin buɗewa kyauta.

Wanne daga cikin waɗannan nau'ikan bincike ya kamata a yi amfani da su a cikin aikin ku? Tabbas, ƙari, mafi kyau! Babban abu shine aiwatar da shi daidai, wanda za'a tattauna gaba.

Bututun isarwa azaman matattarar matakai da yawa da bincike a tsaye azaman cascade na farko

Misali na yau da kullun don ci gaba da haɗin kai shine bututun (bututun) wanda ta hanyarsa ke canzawa - daga canza lambar tushe zuwa isarwa zuwa samarwa. Daidaitaccen jerin matakai na wannan bututun ya yi kama da haka:

  1. a tsaye bincike
  2. tari
  3. gwajin naúrar
  4. gwaje-gwajen haɗin kai
  5. Gwajin UI
  6. duban hannu

Canje-canjen da aka ƙi a matakin Nth na bututun ba a yada su zuwa mataki N+1.

Me yasa daidai wannan hanyar kuma ba in ba haka ba? A cikin ɓangaren gwaji na bututun, masu gwadawa za su gane sanannen dala na gwaji.

Aiwatar da bincike a tsaye a cikin tsari, maimakon neman kwari tare da shi
gwada dala. Source: labarin Martin Fowler.

A kasan wannan dala akwai gwaje-gwajen da suka fi sauƙin rubutu, gudu da sauri, kuma ba sa yin kuskure. Don haka, yakamata a sami ƙarin su, yakamata su rufe ƙarin lambar kuma a fara aiwatar da su. A saman dala, akasin haka gaskiya ne, don haka ya kamata a rage adadin haɗin kai da gwajin UI zuwa mafi ƙarancin buƙata. Mutumin da ke cikin wannan sarkar shi ne ya fi kowa tsada, mafi hankali kuma ba a dogara da shi ba, don haka yana nan a ƙarshe kuma yana yin aiki ne kawai idan matakan da suka gabata ba su sami wani lahani ba. Koyaya, bisa ga ka'idodin guda ɗaya, an gina bututun a cikin sassan da ba su da alaƙa kai tsaye da gwaji!

Ina so in ba da misali ta hanyar tsarin tace ruwa mai matakai da yawa. Ana ba da ruwa mai datti zuwa shigarwa (canje-canje tare da lahani), a cikin fitarwa dole ne mu sami ruwa mai tsabta, wanda aka kawar da duk abubuwan da ba a so ba.

Aiwatar da bincike a tsaye a cikin tsari, maimakon neman kwari tare da shi
Multistage tace. Source: Wikimedia Commons

Kamar yadda ka sani, an tsara matatun tsaftacewa ta yadda kowane kasko na gaba zai iya tace wani ɗan ƙaramin juzu'i na gurɓataccen abu. A lokaci guda, tsaftataccen tsaftar cascades suna da mafi girman kayan aiki da ƙananan farashi. A cikin kwatankwacinmu, wannan yana nufin cewa ƙofofin ingancin shigarwar suna da sauri, suna buƙatar ƙarancin ƙoƙari don farawa, kuma su kansu sun fi rashin fa'ida a cikin aiki - kuma wannan shine ainihin jerin abubuwan da aka gina su a ciki. Matsayin bincike na tsaye, wanda, kamar yadda muka fahimta a yanzu, yana iya kawar da mafi girman lahani kawai, shine aikin grating-"laka" a farkon farkon tace cascade.

Binciken a tsaye da kansa baya inganta ingancin samfurin ƙarshe, kamar yadda "tarkon laka" ba ya sa ruwa ya sha. Kuma duk da haka, tare da sauran abubuwa na isar, mahimmancinsa a bayyane yake. Kodayake a cikin matattarar matakai masu yawa, matakan fitarwa suna da yuwuwar ɗaukar komai daidai da matakan shigarwa, a bayyane yake menene sakamakon ƙoƙarin samun ta tare da matakan tsarkakewa kawai, ba tare da matakan shigarwa ba, zai haifar da.

Manufar "mai tara laka" shine a sauke abubuwan da suka biyo baya daga kama manyan lahani. Misali, aƙalla, mai bitar lambar bai kamata ya shagaltu da shi ba ta hanyar tsara lambar da ba daidai ba da kuma keta ƙa'idodin ƙididdigewa (kamar ƙarin bayanan ƙira ko kuma rassa masu zurfi). Ya kamata a kama kwari kamar NPE ta gwajin naúrar, amma idan ma kafin gwajin mai binciken ya nuna mana cewa lallai ne kwaro ya faru, wannan zai hanzarta gyara shi.

Ina tsammanin yanzu ya bayyana a fili dalilin da yasa bincike na tsaye baya inganta ingancin samfur idan ana amfani dashi lokaci-lokaci, kuma yakamata a yi amfani dashi akai-akai don tace canje-canje tare da manyan lahani. Tambaya ko yin amfani da na'urar tantancewa na tsaye zai inganta ingancin samfuran ku yana daidai da tambayar "Shin ingancin ruwan da aka ɗauka daga tafki mai ƙazanta zai inganta idan an wuce ta cikin colander?"

Aiwatar a cikin aikin gado

Tambaya mai mahimmanci mai mahimmanci: yadda za a gabatar da bincike na tsaye a cikin tsarin ci gaba da haɗin kai a matsayin "ƙofa mai inganci"? A cikin yanayin gwaje-gwaje na atomatik, duk abin da yake a bayyane yake: akwai jerin gwaje-gwaje, gazawar kowane ɗayan su shine isasshen dalili don yin imani da cewa taron bai wuce ƙofar inganci ba. Ƙoƙarin shigar da kofa a cikin hanya ɗaya bisa ga sakamakon bincike na tsaye ya kasa: akwai gargadin bincike da yawa a cikin lambar gado, ba kwa so ku yi watsi da su gaba ɗaya, amma kuma ba zai yiwu ba a dakatar da isar da wani abu. samfurin kawai saboda ya ƙunshi gargaɗin nazari.

Lokacin da aka yi amfani da shi a karon farko, mai nazarin yana haifar da ɗimbin faɗakarwa akan kowane aiki, mafi yawancin waɗanda ba su da alaƙa da daidaitaccen aikin samfurin. Ba shi yiwuwa a gyara duk waɗannan maganganun a lokaci ɗaya, kuma yawancin su ba lallai ba ne. Bayan haka, mun san cewa samfurinmu gaba ɗaya yana aiki, tun kafin gabatarwar bincike na tsaye!

A sakamakon haka, mutane da yawa suna iyakance kansu ga yin amfani da ƙididdiga na ƙididdiga, ko amfani da shi kawai a cikin yanayin sanarwa, lokacin da aka ba da rahoton nazartar kawai yayin taro. Wannan yana daidai da rashin wani bincike, domin idan muna da gargadi da yawa, to, faruwar wani (komai tsanani) lokacin da lambar ta canza ba a lura da ita ba.

Hanyoyi masu zuwa na gabatar da kofofi masu inganci an san su:

  • Yana saita iyaka akan jimillar adadin gargaɗin, ko adadin gargaɗin da aka raba da adadin layukan lamba. Wannan ba ya aiki da kyau, saboda irin wannan ƙofar yana tsallake canje-canje tare da sabbin lahani har sai an wuce iyakar su.
  • Gyara, a wani lokaci, duk tsoffin gargaɗin da ke cikin lambar kamar yadda aka yi watsi da su, da gazawar ginin lokacin da sabbin gargaɗin suka faru. PVS-studio ne ke samar da wannan aikin da wasu albarkatun kan layi, kamar Codacy. Ban sami damar yin aiki a PVS-studio ba, amma ga gogewa ta tare da Codacy, babban matsalar su ita ce ma'anar abin da yake "tsohuwar" da kuma abin da ke "sabon" kuskuren algorithm ne mai rikitarwa wanda ba ya da rikitarwa. koyaushe yana aiki daidai, musamman idan an gyaggyara fayiloli ko kuma an sake suna. A cikin ƙwaƙwalwar ajiyara, Codacy na iya tsallake sabbin gargaɗin a cikin buƙatun ja, kuma a lokaci guda kar ku tsallake buƙatar ja saboda gargaɗin da ba su da alaƙa da canje-canje a cikin lambar wannan PR.
  • A ra'ayi na, an kwatanta mafi inganci bayani a cikin littafin Bayarwa na ci gaba hanyar "racheting". Babban ra'ayi shine cewa dukiya na kowane saki shine adadin gargadin bincike a tsaye, kuma kawai canje-canjen da ba su ƙara yawan adadin gargadi ba an yarda.

Ratchet

Yana aiki kamar haka:

  1. A matakin farko, ana aiwatar da rikodi a cikin sakin metadata na adadin gargaɗin da ke cikin lambar da masu nazari suka samu. Don haka, lokacin da kuka gina sama, ana rubuta manajan ma'ajiyar ku ba kawai "saki 7.0.2", amma "sakin 7.0.2 mai ɗauke da gargaɗin 100500 Checkstyle". Idan kana amfani da babban manajan ma'ajiya (kamar Artifatory), yana da sauƙi don adana irin waɗannan bayanan game da sakin ku.
  2. Yanzu kowane buƙatun ja akan ginin yana kwatanta adadin gargaɗin da yake karɓa da lambar a cikin sakin na yanzu. Idan PR yana haifar da karuwa a wannan lambar, to lambar ba ta wuce kofa mai inganci a cikin bincike na tsaye. Idan adadin gargadi ya ragu ko bai canza ba, to ya wuce.
  3. A saki na gaba, adadin gargaɗin da aka sake ƙididdige za a rubuta a mayar da shi zuwa metadata na sakin.

Don haka kaɗan kaɗan, amma a hankali (kamar yadda yake tare da ratchet), adadin gargaɗin zai zama sifili. Tabbas, ana iya yaudarar tsarin ta hanyar gabatar da sabon gargadi, amma gyara na wani. Wannan al'ada ne, saboda a cikin dogon lokaci yana ba da sakamakon: an gyara gargadi, a matsayin mai mulkin, ba daya bayan daya ba, amma nan da nan ta hanyar rukuni na wani nau'i, kuma duk gargadin da aka kawar da sauri an kawar da su da sauri.

Wannan jadawali yana nuna jimlar adadin gargaɗin Checkstyle na tsawon watanni shida na aiki na irin wannan "ratchet" akan daya daga cikin ayyukanmu na bude tushen. Adadin gargaɗin ya ragu da tsari mai girma, kuma wannan ya faru ta halitta, a layi daya tare da haɓaka samfurin!

Aiwatar da bincike a tsaye a cikin tsari, maimakon neman kwari tare da shi

Ina amfani da fasalin da aka gyara na wannan hanyar, ƙidayar gargaɗi daban ta tsarin aikin da kayan aikin bincike, wanda ya haifar da fayil ɗin YAML tare da metadata na taro mai kama da wani abu kamar haka:

celesta-sql:
  checkstyle: 434
  spotbugs: 45
celesta-core:
  checkstyle: 206
  spotbugs: 13
celesta-maven-plugin:
  checkstyle: 19
  spotbugs: 0
celesta-unit:
  checkstyle: 0
  spotbugs: 0

A cikin kowane tsarin CI mai ci gaba, ana iya aiwatar da ratchet don kowane kayan aikin bincike na tsaye ba tare da dogaro da plugins da kayan aikin ɓangare na uku ba. Kowanne daga cikin masu nazarin yana samar da rahotonsa a cikin sassauƙan rubutu ko tsarin XML mai sauƙin tantancewa. Ya rage don yin rajista kawai mahimmancin dabaru a cikin rubutun CI. Kuna iya ganin yadda ake aiwatar da wannan a cikin ayyukan buɗe tushen mu dangane da Jenkins da Artifatory, kuna iya a nan ko a nan. Duk misalan biyu sun dogara da ɗakin karatu ratchetlib: hanya countWarnings() yana ƙirga alamun xml a cikin fayilolin da Checkstyle da Spotbugs suka haifar a hanyar da aka saba, kuma compareWarningMaps() yana aiwatar da ratchet iri ɗaya, yana jefa kuskure lokacin da adadin gargaɗin a cikin kowane nau'in ya tashi.

Aiwatar da aiwatar da ratchet mai ban sha'awa yana yiwuwa don nazarin rubutun kalmomi na sharhi, ainihin rubutu, da takardu ta amfani da aspell. Kamar yadda ka sani, lokacin duba rubutun, ba duk kalmomin da ba a sani ba ga daidaitattun ƙamus ba daidai ba ne, ana iya ƙara su zuwa ƙamus na mai amfani. Idan kun sanya ƙamus na mai amfani na lambar tushen aikin, to ana iya ƙirƙira ƙofar ingancin rubutun kamar haka: aiwatar da aspell tare da daidaitattun ƙamus da ƙamus na mai amfani. bai kamata ba sami kurakurai na rubutu ba.

Game da mahimmancin gyaran sigar nazari

A ƙarshe, ya kamata a lura da waɗannan abubuwa: komai yadda kuka aiwatar da bincike a cikin bututun isar da ku, dole ne a gyara sigar na'urar. Idan ka ƙyale mai nazarin ya sabunta ba tare da bata lokaci ba, to lokacin gina buƙatun ja na gaba, sabbin lahani na iya “ɓullo da”, waɗanda ba su da alaƙa da canje-canjen lambar, amma suna da alaƙa da gaskiyar cewa sabon mai nazari yana iya samun ƙarin lahani. kuma wannan zai karya tsarin ku na karɓar buƙatun ja . Haɓaka nazartar ya kamata ya zama aikin sane. Koyaya, ƙwaƙƙwaran gyare-gyaren sigar kowane ɓangaren taro shine buƙatu na gabaɗaya kuma jigo don tattaunawa ta daban.

binciken

  • Binciken a tsaye ba zai samo muku kwari ba kuma ba zai inganta ingancin samfurin ku ba sakamakon aikace-aikace guda ɗaya. Iyakar ingantaccen tasiri akan inganci shine ci gaba da amfani da shi yayin aiwatar da isarwa.
  • Nemo kwari ba shine babban aikin bincike kwata-kwata ba, yawancin ayyuka masu amfani suna samuwa a cikin kayan aikin buɗewa.
  • Aiwatar da ƙofofi masu inganci dangane da sakamakon bincike a tsaye a matakin farko na bututun isar da sako, ta amfani da ratchet don lambar gado.

nassoshi

  1. Bayarwa na ci gaba
  2. A. Kudryavtsev: Nazarin shirye-shirye: yadda za a fahimci cewa kai mai shirye-shirye ne mai kyau bayar da rahoto kan hanyoyin bincike na lamba daban-daban (ba kawai a tsaye ba!)

source: www.habr.com

Add a comment