版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Google如何
建立程序分析生態(tài)系統(tǒng)2023/2/5Agenda程序分析存在的問題項目的目標Google的背景Google的程序分析理論項目的實施思考ReferenceTricorder:BuildingaProgramAnalysisEcosystemPage2程序員已經(jīng)很忙了工具必須非常重視是否讓開發(fā)人員花費更多額外的時間來處理工具的結(jié)果;任何自動工具的輸出都會使開發(fā)人員從原來的開發(fā)思考停頓下來;好的工具應(yīng)該給盡量少的打擾開發(fā)人員,并為開發(fā)人員帶來更多的附加值;工具的問題Highfalsepositive
rates(高誤報率)Confusingoutput(令人費解的輸出報告)Poorintegrationintothedevelopers’workflow(不能很好的融合到程序員的日常的開發(fā)流程中)平臺擴展的問題Google存在不同的框架和開發(fā)語言;一個理想的平臺能夠適應(yīng)這些需求能夠讓各領(lǐng)域的專家來編寫自己的檢查工具,而不需要額外的應(yīng)用成本;Google的業(yè)務(wù)需求不能滿足google巨大代碼量的需求,一個完整的編譯過程是無法用一臺機器完成的;分析必須能夠被拆分(shared),并且能夠分析拆分的信息,得到這部分的結(jié)果。分塊的分析必須能夠在極短的時間內(nèi)完成,在幾分鐘內(nèi)得到結(jié)果;靜態(tài)分析存在的問題Page3能夠普遍地、積極地、主動地被程序員用來修復(fù)程序中存在的問題(bewidelyandactivelyusedbydeveloperstofixproblemsintheircode,withoutpromptingfromasmallgroupofadvocatesormanagement);無縫地整合到現(xiàn)有的開發(fā)流程中(integratesmoothlyintotheexistingdeveloperworkflow);能夠度量所有的代碼(scaletothesizeofanindustrialcodebase);授權(quán)給開發(fā)者(甚至他們不是分析專家),讓他們自己能夠編寫他們自己的檢查規(guī)則(empowerdevelopers,evennon-analysisexperts,towriteanddeploytheirownstaticanalyses).理想的靜態(tài)分析平臺Page4Agenda程序分析存在的問題項目的目標Google的背景Google的程序分析理論項目的實施思考ReferenceTricorder:BuildingaProgramAnalysisEcosystemPage5項目目標WepresentTRICORDER,aprogramanalysisplatformaimedatbuildingadata-driven
ecosystemaroundprogramanalysis.Wepresentasetofguiding
principlesforourprogramanalysistoolsandascalablearchitecture
forananalysisplatformimplementingtheseprinciples.
Weincludeanempirical,in-situevaluationofthetoolasitis
usedbydevelopersacross
Googlethatshowstheusefulnessand
impactoftheplatform.TRICORDER構(gòu)建一個圍繞程序分析,以數(shù)據(jù)驅(qū)動的程序分析平臺;建立一套程序分析工具的應(yīng)用規(guī)則;平臺通過度量(使用、效果)方式實施這些規(guī)則,并與開發(fā)流程融合。通過建立一個在開發(fā)程序員和規(guī)則開發(fā)者之間的閉環(huán)的反饋系統(tǒng),來完成問題的反饋、自動修復(fù)(部分);一個建立在程序員在開發(fā)流程中應(yīng)用工具的具體信息數(shù)據(jù)來度量的平臺;一個以微服務(wù)構(gòu)建的適用google的代碼項目規(guī)模的平臺。每天會產(chǎn)生9,3000的掃描報告,但僅由2-3人維護的系統(tǒng);Page6Page7息處理類:
可以無線下載目標終端的數(shù)據(jù)。包括非星聯(lián)系統(tǒng),并且可以處理和分析數(shù)據(jù)。三錄儀也可以作為一個數(shù)據(jù)終端,多臺可以聯(lián)網(wǎng)處理數(shù)據(jù)。掃描器類:
通過掃描波束來確定目標的介質(zhì),化學成分等,也可以掃描周圍的空間組成,探測此范圍內(nèi)的生命信號,以及對目標物體成像,醫(yī)用的CT等。工程技術(shù)類:
可以通過掃描來診斷設(shè)備的故障。并且優(yōu)化顯示故障排除方法。TRICORDER是一種手持式的多用途儀器。它是星際旅行里經(jīng)常要用到的一種必備儀器。/operations/tricorder.htmlThetricorderof2266wasacompactinstrumentthatfeaturedscanning,recording,andcomputingtechnology.
Star
trek–星際迷航星際迷航中的科技:平板電腦(PAAD)、GPS、大顯示屏、宇宙翻譯機、自動門、手機、傳送器、復(fù)制機、全息技術(shù)、曲速旅行、視屏會議等等。。。史蒂芬·霍金2002年《果殼中的宇宙》--即使把我關(guān)在果殼之中,仍然自以為無限宇宙之王Agenda程序分析存在的問題項目的目標Google的背景Google的程序分析理論項目的實施思考ReferenceTricorder:BuildingaProgramAnalysisEcosystemPage8許多工程師都是在一個很大的代碼庫上進行開發(fā)的performmorethan800kbuilds,run100Mtestcases,produce2PBofbuildoutputs,andsend30kchangelistsnapshots(patchdiffs)forreview大代碼庫使代碼重用和重構(gòu)變得非常容易和普遍;Google有極強的整合測試的測試文化(Googlehasastrongtestingculture
backedbycontinuoustestinginfrastructure)Google采用一套統(tǒng)一的標準的構(gòu)建和發(fā)布系統(tǒng)(Googleengineersuseastandardized,distributedbuildsystemtoproducehermeticbuildsfromsourcecode);統(tǒng)一的構(gòu)建系統(tǒng)為代碼分析提供了統(tǒng)一的接入點Google有極強的代碼審視文化每一個Changelist都會被在checked-in之前被審視Google的開發(fā)特點Page9要求開發(fā)人員能夠方便的運行分析工具,能夠快速地得到結(jié)果Google的Codereview工具類似gerritPage10/p/gerrit/issues/listprovidestheabilitytocommentonlinesofcode,replytoexistingcomments,uploadnewsnapshotsofthecodebeingreviewed(author),approvethechangelist(reviewer).Google曾經(jīng)嘗試過將以下工具整合到開發(fā)流程中Find-Bugs,Coverity,Klocwork,缺陷預(yù)測理論(faultprediction)這些工具存在的問題與工作流程的整合太晚:只有在提交代碼之后才能得到結(jié)果太早:開發(fā)人員還在調(diào)試代碼的時候就出現(xiàn)了幾乎都需要運行單獨的命令,不能與編譯器整合在一起掃描的規(guī)模。這個問題在桌面工具有為突出高誤報率結(jié)論當工具有單獨的命令或即使通過儀表盤來運行的時候,使用量會慢慢減少Google的程序分析Page11Agenda程序分析存在的問題項目的目標Google的背景Google的程序分析理論項目的實施思考ReferenceTricorder:BuildingaProgramAnalysisEcosystemPage12沒有誤報(Nofalsepositives)研究表明誤報是程序員不愿意采用分析工具去發(fā)現(xiàn)bug的主要原因之一Google理解為有效的誤報率(effectivefalsepositive)標示工具不確定的告警(這類問題往往是因為工具得到的信息不足)能提高代碼可讀性的缺陷,不被認為是誤報;不過度分析,不考慮實際中不會出現(xiàn)的情景(theoreticalfalsepositives)Google的程序分析理論—沒有誤報Page13讓開發(fā)人員來決定工具的作用和誤報率developerswilldecidewhetherananalysistoolhashighimpact,andwhatafalsepositiveis.Google的程序分析理論—用戶參與Page14用戶參與(Empoweruserstocontribute)只有用戶自己最了解自己的項目,讓他們自己來寫規(guī)則,并對結(jié)果負責;這些領(lǐng)域的專業(yè)人員并不了解如何和流程的整合,這也是平臺的作用;為了保證質(zhì)量我們和開發(fā)規(guī)則人員約定規(guī)則下線條款:沒有人使用這個檢查(Nooneisfixingbugsfiledagainsttheanalyzer.)資源的使用影響了系統(tǒng)(Resourceusage(e.g.CPU/disk/memory)isaffectingTRICORDERperformance)分析報告讓開發(fā)人員困惑(Theanalyzerresultsareannoyingdevelopers)經(jīng)驗表明自豪感會讓規(guī)則的開發(fā)者有著強烈的主動性去避免規(guī)則下線。Google的程序分析理論—數(shù)據(jù)提高可用性Page15數(shù)據(jù)提高可用性(Makedata-drivenusabilityimprovements)問題響應(yīng)非常重要。程序員和工具建立信任關(guān)系,這種信任會因為對報告的不理解迅速減低;一款工具的bug在改進了用詞或連接到了幫助文檔后,75%被修復(fù);建立一個反饋系統(tǒng)能很好的提升工具的可用性;Google的程序分析理論—工作流整合是關(guān)鍵Page16工作流整合是關(guān)鍵(Workflowintegrationiskey)與工作流整合是提高工具的效果的關(guān)鍵因素;工具的觸發(fā)最好由:編輯代碼editingcode,運行編譯runningabuild,創(chuàng)建或更新修改表creating/updatingachangelist,提交一個更新表submittingachangelist.掃描的報告最好在提交代碼之前得到一個調(diào)查表明程序員期望在編譯時就得到檢查報告的人數(shù)是在提交修改列表時的兩倍;在編譯時檢查,就要求有效的誤報率要幾乎等于0,最高不超過5%Tricorder與工作流的整合Page17編譯器分析工具與編譯告警一起送給開發(fā)者提交代碼審核分析工具一起送給代碼審計者要求:速度快,誤報<5%要求:5-10分鐘,誤報<10%開發(fā)流程審計流程修改代碼IDE本地分析工具遠端分析工具每日構(gòu)建分析工具分析報告專職團對專職處理TricorderGoogle的程序分析理論—根據(jù)項目定制Page18根據(jù)項目定制(Projectcustomization,notusercustomization)Google的經(jīng)驗表明,用戶的自定義(對告警的標準不一),將導(dǎo)致團隊內(nèi)部的混亂;不采用告警處理優(yōu)先級和嚴重等級的設(shè)定,只顯示嚴重等級的問題;我們能夠取消或改善低優(yōu)先級、收益小的檢查由結(jié)果過濾器改為自定義分析器;我們大大減少了,為什么有些結(jié)果會出現(xiàn),為什么結(jié)果的看法不一致等問題。給項目組一定的定制權(quán),讓項目組來決定是否采用可選分析器沒有誤報(Nofalsepositives)用戶參與(Empoweruserstocontribute)數(shù)據(jù)提高可用性(Makedata-drivenusabilityimprovements)根據(jù)項目定制(Projectcustomization,notusercustomization)Google的程序分析理論--小結(jié)Page19Agenda程序分析存在的問題項目的目標Google的背景Google的程序分析理論項目的實施思考ReferenceTricorder:BuildingaProgramAnalysisEcosystemPage20Tricorder的架構(gòu)Page21Google-specificRPClibraryJavaAnalyzerC++AnalyzerPythonAnalyzerGoAnalyzerlanguage-specificinterfaceLanguageanalyzerservicesCommonlanguage-agnosticprotocolbufferAPICompileranalyzerservicesClangPlugInjavacjscompilerLinterworkserviceslanguage-specificinterfaceGetCategoryGetStageAnalyzeThecategory(andoptionallysubcategory)oftheanalysisresult.Thelocationoftheanalysisresultinthecode,e.g.fileandrange(line/column)withinthatfile.Theerrormessage.AURLwithmoredetailedinformationabouttheanalyzerand/orthemessage.Anorderedlistoffixes./google/shipshapeTricorder的三個階段Page22文件階段(FILES)處理修改的文件依賴階段(DEPS)處理修改文件的依賴文件編譯階段(COMPILATION)處理編譯的文件分階段的優(yōu)點能夠在更快的提供報告,而不需要等到構(gòu)建完成可以降低成本高的資源的使用不影響在更早的時候開發(fā)分析Tricorder的AnalyzerPage2316of30analyzersruninTRICORDER大約9,7000與目標總數(shù)9,3000相當35Linter7analyzer告警必須簡單、容易理解,能夠明確修復(fù)(Thewarningshouldbeeasytounderstandandthe
fixshouldbeclear);告警應(yīng)該有非常小的誤報率(<10%)(Thewarningshouldhaveveryfewfalsepositives.),同樣的標準也用于Coverity等其他工具告警應(yīng)該有足夠的嚴重程度(Thewarningshouldbeforsomethingthathasthepotentialforsignificantimpact.)告警應(yīng)該是發(fā)生次數(shù)少但經(jīng)常被注意的問題(Thewarningshouldoccurwithasmallbutnoticeablefrequency.)如果這個問題經(jīng)常出現(xiàn),意味著它的危害不大,不應(yīng)該給出過多的告警。Tricorder的Analyzer規(guī)則評定標準Page24存在爭議的問題:檢測工具已經(jīng)檢測出問題來了,還讓很忙的程序員自己來處理問題?Google鼓勵這么做,通過代碼review工具。Tricorder問題的修復(fù)Page25這樣做的好處是:讓程序員方便修復(fù)更好地解釋報告修復(fù)不是直接修改代碼,而是提供修改的按鈕。為了快速提供反饋信息,Tricorder和代碼審計工具連通(robocomment)。在每個問題上有四個連接:NOTUSEFULPLEASEFIXPREVIEWFIX(Show)APPLYFIX(Apply)not-usefulrate=NOTUSEFUL/(NOTUSEFUL+PLEASEFIX+APPLYFIX)>=10%進入觀察區(qū)>25%考慮立刻下線很多時候是和Analyzer的編制者一起來看問題的發(fā)生原因不適合的項目不在意一時的波動Tricorder反饋系統(tǒng)Page26可用性(Usability)用無用率(Not-usefulrate)來衡量工具的可用性。目前<5%Tricorder運行結(jié)果–可用性Page27Tricorder運行結(jié)果–可用性Page28Privew_fix和Please_fix相關(guān)點擊率統(tǒng)計結(jié)果的一些思考許多開發(fā)人員在審核人員查看之前完成問題修復(fù),所以PLEASE_FIX數(shù)量低;許多開發(fā)人員在IDE里修復(fù)問題,所以APPLY_FIX數(shù)量低;開發(fā)人員會忽略他們不打算修復(fù)問題,而不是點擊NOT_USEFUL,這暗示他們對這些問題看法的強烈程度;開發(fā)人員可能錯誤地點擊了NOT_USEFUL好的Analyzer的NOT_USEFUL率在0-3%隨著時間推移,減少了問題代碼的入庫;開發(fā)人員通過問題的學習,相同的問題數(shù)量減少了;Tricorder運行結(jié)果–代碼庫的影響Page29平均一天發(fā)現(xiàn)30個分類的9,3000問題;運行5,000次構(gòu)建;審核人平均點PLEASE_FIX716次,其中416次屬于Linters),48次NOT_USEFUL.Tricorder運行結(jié)果–運營能力Page30平均每個CL有兩個PLEASE_FIX,無NOT_USEFUL通過數(shù)據(jù)驅(qū)動可用性的提高;開發(fā)人員不喜歡誤報,所以需要建立一個快速反饋系統(tǒng)來聽取他們的意見;讓用戶自己來建立自己的檢查規(guī)則;檢查工具和工作流程融合非常重要,實踐表明最好的融合點是代碼審視階段;檢查工具的定制是項目定制,而不是用戶定制;簡單的規(guī)則會起到很大的作用(Google并未采用復(fù)雜技術(shù)的檢查工具);工具的目的是修復(fù)bug,而不是發(fā)現(xiàn)bug;Tricorder實施經(jīng)驗回顧Page31Agenda程序分析存在的問題項目的目標Google的背景Google的程序分析理論項目的實施思考ReferenceTricorder:BuildingaProgramAnalysisEcosystemPage32檢查工具的結(jié)果要和IDE/代碼審視工具融合;檢查工具需要給出清晰的解釋,提供修復(fù)的方法建立信息的反饋系統(tǒng),聽取開發(fā)人員對工具的看法,及時作出反應(yīng);考慮建立編譯器的插件,完成編譯時的檢查;在掃描報告中加入更多的錯誤修改方法的說明,以及相關(guān)知識庫的連接信息;思考Page33工具最好與工作流整合,減少對程序員的干擾。最好通過編譯與代碼審視工具整合在一起;通過代碼審視工具收集工具的效果信息;收集的信息,評估工具的效果;工具需要給出盡可能詳細的幫助信息,甚至能夠輔助開發(fā)人員完成修改;Google的代碼檢查理念Page34Tricorder與工作流的整合Page35編譯器分析工具與編譯告警一起送給開發(fā)者提交代碼審核分析工具一起送給代碼審計者要求:速度快,誤報<5%要求:5-10分鐘,誤報<10%開發(fā)流程審計流程修改代碼IDE本地分析工具遠端分析工具每日構(gòu)建分析工具分析報告專職團對專職處理Tricorder通過代碼審視工具收集工具的使用效果Page36Not-usefulrate=NOTUSEFUL/(NOTUSEFUL+PLEASEFIX+APPLYFIX)NOTUSEFULPLEASEFIXPREVIEWFIX(Show)APPLYFIX(Apply)Tricorder:BuildingaProgramAnalysisEcosystemmicroservices/articles/microservices.htmlReferencePage37AddressSanitizerisafastmemoryerrordetector.Itconsistsofacompilerinstrumentationmoduleandarun-timelibrary.Thetoolcandetectthefollowingtypesofbugs:Out-of-boundsaccessestoheap,stackandglobalsUse-after-freeUse-after-return(runtimeflag
ASAN_OPTIONS=detect_stack_use_after_return=1)Use-after-scope(clangflag
-fsanitize-address-use-after-scope)Double-free,invalidfreeMemoryleaks(experimental)AddressSanitizerPage38/docs/AddressSanitizer.htmlErrorProneisastaticanalysistoolforJavathatcatchescommonprogrammingmistakesatcompile-time.ErrorPronePage39/google/error-prone/bugpatternsArgumentParameterSwap
Theargumentandparameternamesdonotmatchexactly.ArrayEquals
ReferenceequalityusedtocomparearraysArrayHashCode
hashcodemethodonarraydoesnothasharraycontentsArrayToString
CallingtoStringonanarraydoesnotprovideusefulinformationArraysAsListPrimitiveArray
Arrays.asListdoesnotautoboxprimitivearrays,asonemightexpect.AsyncFunctionReturnsNull
AsyncFunctionshouldnotreturnanullFuture,onlyaFuturewhoseresultisnull.BadShiftAmount
ShiftbyanamountthatisoutofrangeChainingConstructorIgnoresParameter
Thecalledconstructoracceptsaparameterwiththesamenameandtypeasoneofitscaller'sparameters,butitscallerdoesn'tpassthatparametertoit.It'slikelythatitwasintendedto.CheckReturnValue
Ignoredreturnvalueofmethodthatisannotatedwith@CheckReturnValueClassName
Thesourcefilenameshouldmatchthenameofthetop-levelclassitcontainsComparisonOutOfRange
ComparisontovaluethatisoutofrangeforthecomparedtypeCompileTimeConstant
Non-compile-timeconstantexpressionpassedtoparameterwith@CompileTimeConstanttypeannotation.ConstantOverflow
Compile-timeconstantexpressionoverflowsDaggerProvidesNull
Dagger@Providesmethodsmaynotreturnnullunlessannotatedwith@NullableDeadException
ExceptioncreatedbutnotthrownDepAnn
Deprecateditemisnotannotatedwith@DeprecatedEqualsNaN
==NaNalwaysreturnsfalse;usetheisNaNmethodsinsteadForOverride
Methodannotated@ForOverridemustbeprotectedorpackage-privateandonlyinvokedfromdeclaringclassFuturesGetCheckedIllegalExceptionType
Futures.getCheckedrequiresacheckedexceptiontypewithastandardconstructor.GetClassOnAnnotation
CallinggetClass()onanannotationmayreturnaproxyclassGetClassOnClass
CallinggetClass()onanobjectoftypeClassreturnstheClassobjectforjava.lang.Class;youprobablymeanttooperateontheobjectdirectlyGuardedByChecker
Checksforunguardedaccessestofieldsandmethodswith@GuardedByannotationsGuavaSelfEquals
AnobjectistestedforequalitytoitselfusingGuavaLibrariesGuiceAssistedInjectScoping
ScopeannotationonimplementationclassofAssistedInjectfactoryisnotallowedGuiceAssistedParameters
Aconstructorcannothavetwo@Assistedparametersofthesametypeunlesstheyaredisambiguatedwithnamed@Assistedannotations.GuiceInjectOnFinalField
AlthoughGuiceallowsinjectingfinalfields,doingsoisdisallowedbecausetheinjectedvaluemaynotbevisibletootherthreads.HashtableContains
contains()isalegacymethodthatisequivalenttocontainsValue()IdentityBinaryExpression
Writing"a&&a","a||a","a&a",or"a|a"isequivalentto"a".InfiniteRecursion
Thismethodalwaysrecurses,andwillcauseaStackOverflowErrorInjectMoreThanOneScopeAnnotationOnClass
Aclasscanbeannotatedwithatmostonescopeannotation.InsecureCipherMode
Cipher.getInstance()isinvokedusingeitherthedefaultsettingsorECBmodeInvalidPatternSyntax
InvalidsyntaxusedforaregularexpressionIsInstanceOfClass
TheargumenttoClass#isInstance(Object)shouldnotbeaClassJUnit3TestNotRun
Testmethodwillnotberun;pleaseprefixnamewith"test"JUnit4SetUpNotRun
setUp()methodwillnotberun;Pleaseadda@BeforeannotationJUnit4TearDownNotRun
tearDown()methodwillnotberun;Pleaseaddan@AfterannotationJUnit4TestNotRun
Testmethodwillnotberun;pleaseadd@TestannotationJavaxInjectOnAbstractMethod
Abstractanddefaultmethodsarenotinjectablewithjavax.inject.InjectLongLiteralLowerCaseSuffix
Prefer'L'to'l'forthesuffixtolongliteralsMislabeledAndroidString
Certainresourcesin
android.R.string
havenamesthatdonotmatchtheircontentMisusedWeekYear
Useof"YYYY"(weekyear)inadatepatternwithout"ww"(weekinyear).Youprobablymeanttouse"yyyy"(year)instead.MockitoCast
AbuginMockitowillcausethistesttofailatruntimewithaClassCastExceptionMockitoUsage
Missingmethodcallforverify(mock)hereModifyingCollectionWithItself
Usingacollectionfunctionwithitselfastheargument.MoreThanOneInjectableConstructor
Thisclasshasmorethanone@Inject-annotatedconstructor.Pleaseremovethe@Injectannotationfromallbutoneofthem.NonCanonicalStaticImport
Staticimportoftypeusesnon-canonicalnameNonFinalCompileTimeConstant
@CompileTimeConstantparametersshouldbefinalOptionalEquality
ComparisonusingreferenceequalityinsteadofvalueequalityOverlappingQualifierAndScopeAnnotation
AnnotationscannotbebothScopeannotationsandQualifierannotations:thiscausesconfusionwhentryingtousethem.Overrides
Varargsdoesn'tagreeforoverriddenmethodOverridesJavaxInjectableMethod
Thismethodisnotannotatedwith@Inject,butito
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年05月廣東中信銀行廣東廣州分行春季校園招考筆試歷年參考題庫附帶答案詳解
- 《社區(qū)服務(wù)平臺》課件
- 2025年浙教新版七年級物理上冊階段測試試卷
- 2024年曲靖市婦幼醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 2025年上教版八年級地理下冊階段測試試卷
- 2024年滬科版必修2物理下冊階段測試試卷
- 2024年浙教版高二生物上冊階段測試試卷
- 醫(yī)院特殊用電需求供用電管理辦法
- 時尚展覽館建設(shè)施工合同
- 航空服務(wù)承諾:乘務(wù)員安全守護書
- (完整)公共衛(wèi)生基本知識考試題題庫及答案
- 零星工程(零星用工)簽認單
- 動物營養(yǎng)學(講義)
- 出口貨物備案單證目錄(生產(chǎn)企業(yè))
- 中國食物成分表2018年(標準版)第6版 第一冊 素食
- 甘肅科技重大專項計劃申報書模版
- 35kV線路工程電桿組立工程施工組織方案
- 畢業(yè)論文材料分揀裝置PLC控制系統(tǒng)方案
- 刑法涉及安全生產(chǎn)的16宗罪解讀
- 京東五力模型分析
- 電大《電氣傳動與調(diào)速系統(tǒng)》網(wǎng)絡(luò)課形考任務(wù)1-4作業(yè)及答案
評論
0/150
提交評論