सॉफ्टवेयर इंजीनियरिंग जॉब मार्केट में हम जो रुझान देखते हैं, उसमें मुझे वास्तव में दिलचस्पी है। कभी-कभी जो हो रहा है उसके बारे में एक समेकित और सटीक कथा बताना वास्तव में कठिन होता है क्योंकि यह इतनी तेजी से होता है, और बहुत कम लोग इस मामले पर डेटा एकत्र कर रहे हैं।
उदाहरण के लिए, यहां कुछ प्रश्न दिए गए हैं जिनका उत्तर मैं जानना चाहता हूं:
मैंने इनमें से कुछ सवालों के जवाब देने में सक्षम होने के लिए पिछले 9 वर्षों के स्टैक ओवरफ्लो सर्वेक्षणों से डेवलपर रोजगार के बारे में सभी उत्तरों को एकत्रित किया है। यदि आप डेवलपर्स के लिए नौकरी के दृष्टिकोण के बारे में उत्सुक हैं, तो उम्मीद है कि यह उपयोगी डेटा है।
तालिकाओं में सभी संख्याएं सर्वेक्षणकर्ताओं के प्रतिशत का प्रतिनिधित्व करती हैं जिन्होंने स्वयं को किसी दिए गए कार्य प्रकार के रूप में पहचाना।
SO द्वारा पूछे गए प्रश्न वर्षों में बदल गए हैं, इसलिए हमें इसे नमक के एक विशाल दाने के साथ लेना चाहिए।
मैंने उत्तरों को सामान्य कर दिया है। उदाहरण के लिए, "डेवलपर, बैक-एंड" और "बैक-एंड वेब डेवलपर" मैंने "बैकएंड" के रूप में एक साथ समूहीकृत किया है।
स्टैक ओवरफ्लो ने लोगों को 2015 के बाद 0-अनेक जॉब टाइटल चुनने की अनुमति दी, इससे पहले, ऐसा प्रतीत होता है कि वे एक तक सीमित थे।
कुछ वर्षों में डेवलपर्स के पास चुनने के लिए अधिक नौकरी के विकल्प थे।
मैंने "एंटरप्राइज़ सर्विसेज डेवलपर" और "निर्वाचित अधिकारी" जैसे बहुत सारे ऑफ-टॉपिक जॉब प्रकारों को फेंक दिया है।
यह केवल स्टैक ओवरफ़्लो डेटा है, इसलिए यह प्रत्येक वर्ष उनके उपयोगकर्ता आधार के आकार के आधार पर पक्षपाती है।
उस ने कहा, आइए आंकड़ों में आते हैं। मैं इस आलेख के निचले भाग में समग्र डेटा के साथ-साथ कच्चे डेटा के लिए एक लिंक बनाने के लिए लिखी गई स्क्रिप्ट को छोड़ दूंगा।
साल | पूर्ण हो चुकी है | फ़्रंट एंड | बैकएंड |
---|---|---|---|
2013 | 24.5 | 4.31 | 7.88 |
2014 | 25.72 | 5.02 | 9.3 |
2015 | 25.93 | 4.76 | 8.07 |
2016 | 37.88 | 5.13 | 10.82 |
2017 | 51.05 | 2.47 | 5.08 |
2018 | 44.87 | 35.22 | 53.92 |
2019 | 47.5 | 29.98 | 45.75 |
2020 | 42.08 | 28.38 | 42.24 |
2021 | 39.42 | 21.85 | 34.84 |
2022 | 39.17 | 21.72 | 36.99 |
2013 में, "फ्रंट-एंड" डेवलपर्स का "फुल-स्टैक" डेवलपर्स का अनुपात 15/85 था, जबकि "बैक-एंड" डेवलपर्स का "फुल-स्टैक" डेवलपर्स का अनुपात 24/76 था।
पूरे दस वर्षों के डेटा के माध्यम से "अधिक पूर्ण-स्टैक, कम विशेषज्ञता" की प्रवृत्ति जारी है। यह ध्यान रखना महत्वपूर्ण है कि 2017/2018 में, सर्वेक्षण में भारी बदलाव आया, यही वजह है कि हम संख्याओं में एक बड़ा बदलाव देखते हैं।
यह निष्कर्ष निकालना उचित प्रतीत होता है कि पिछले एक दशक से प्रवृत्ति यह रही है कि ऐसे डेवलपर्स का प्रतिशत घट रहा है जो केवल फ्रंट-एंड काम करते हैं या केवल बैक-एंड काम करते हैं। अधिक से अधिक पूर्ण-स्टैक इंजीनियरों के रूप में दोगुने हो रहे हैं।
ध्यान रखें, यह भी हो सकता है कि पिछले कुछ वर्षों में छोटी से लेकर मध्यम आकार की कंपनियां अधिक रही हों। छोटी कंपनियों को आम तौर पर अधिक सामान्यवादियों की आवश्यकता होती है, लेकिन अब मैं सिर्फ अनुमान लगा रहा हूं।
फ्रंट-एंड/बैक-एंड इंजीनियरों का अनुपात काफी सुसंगत रहा है, फ्रंट-एंड इंजीनियरों की तुलना में बैक-एंड इंजीनियरों की तुलना में दोगुने से थोड़ा कम है।
इसने वास्तव में मुझे आश्चर्यचकित कर दिया, मुझे उम्मीद थी कि फ्रंट-एंड से बैक-एंड इंजीनियरों का अनुपात पूरे वर्षों में करीब रहेगा।
साल | बैकएंड | देवऑप्स | ऑप्स |
---|---|---|---|
2013 | 7.88 | 0 | 2.96 |
2014 | 9.3 | 1.61 | 2.85 |
2015 | 8.07 | 1.23 | 1.77 |
2016 | 10.82 | 1.92 | 1.79 |
2017 | 5.08 | 7.81 | 13.66 |
2018 | 53.92 | 9.66 | 18.33 |
2019 | 45.75 | 11.43 | 15.93 |
2020 | 42.24 | 10.51 | 13.11 |
2021 | 34.84 | 9.75 | 10.82 |
2022 | 36.99 | 13.2 | 11.8 |
मेरी स्क्रिप्ट में, मैंने "ऑप्स" श्रेणी में और अधिक "पारंपरिक ऑप्स" भूमिकाओं को विभाजित करने की कोशिश की, और "DevOps" सामग्री को "DevOps" भूमिका में विभाजित किया। उदाहरण के लिए, "SRE" को मैंने "DevOps" माना है, जबकि "सिस्टम एडमिनिस्ट्रेटर" "ops" है।
आखिर 2017 में क्या हुआ था? डेटा ईमानदारी से बस टूटा हुआ लगता है। मैंने डेटा के माध्यम से मैन्युअल रूप से खोदा क्योंकि वेबसाइट के अनुसार, उनका दावा है कि 24% वेब डेवलपर्स ने कहा कि वे बैक एंड थे, और 75% उत्तरदाताओं ने वेब डेवलपर्स होने का दावा किया।
फिलहाल, यह मुझे ऐसे देख रहा है जैसे उनके पास उन नंबरों पर कुछ क्वालीफायर रहे होंगे क्योंकि यह मेरे अंत में नहीं जुड़ रहा है। मैं व्याख्याओं में अपने विश्लेषण से 2017 को बाहर करने जा रहा हूं।
ऐसा प्रतीत होता है कि DevOps पारंपरिक ऑप्स पर अपनी पकड़ मजबूत कर रहा है। 2013 में, कोई भी खुद को "DevOps" व्यक्ति के रूप में नहीं पहचान रहा था, लेकिन 2020 और 2021 तक, संख्या बहुत समान दिख रही है।
यह इंगित करने योग्य है कि 2016 में, DevOps संख्याओं ने वास्तव में एक वर्ष के लिए "ऑप्स" संख्याओं को ग्रहण कर लिया था। मेरा सबसे अच्छा अनुमान यह है कि 2016 वह समय था जब कई कंपनियों ने शांत दिखने के लिए अपनी "ऑप्स" टीमों को "DevOps" टीमों के रूप में रीब्रांड करना शुरू कर दिया था।
इन नंबरों के बारे में बहुत अधिक परवाह करना कठिन है क्योंकि मेरी राय में DevOps को ज्यादातर गलत किया जा रहा है । मुझे विश्वास नहीं है कि "ops" शीर्षक और "DevOps" शीर्षक अधिकांश कंपनियों में अलग-अलग हैं।
"DevOps" हाल के वर्षों में सबसे कम ट्रेंड कर रहा है, वास्तव में, 2022 में इसमें अच्छी छलांग लगी थी। हालाँकि, यदि आप "DevOps" और "ops" को एक साथ देखें, तो यह श्रेणी अभी भी थोड़ी नीचे ट्रेंड कर रही है।
दिलचस्प बात यह है कि "ऑप्स" शुरू से ही नीचे की ओर चल रहा है, जबकि "बैक-एंड" 2016 तक चलन में था जब प्रवृत्ति उलट गई और तब से यह नीचे है।
सबसे पहले, मैंने मान लिया था कि हम केवल वही प्रवृत्ति देख रहे हैं जो हमने वेब विकास में देखी थी: अधिक सामान्यवादी, कम विशेषज्ञ।
हालाँकि, मुझे संदेह हुआ क्योंकि जब मैंने सभी नौकरी श्रेणियों को देखा, तो मैंने देखा कि उनमें से लगभग सभी नीचे की ओर चल रहे थे ...
मैंने अपनी स्क्रिप्ट में आगे की खोज के लिए एक नया खंड जोड़ने का फैसला किया। मैंने गणना की कि प्रत्येक सर्वेक्षणकर्ता औसतन कितनी नौकरियों का दावा कर रहा था, और यह डेटा प्राप्त किया:
साल | बैकएंड | देवऑप्स | ऑप्स | avg_jobs_per_user |
---|---|---|---|---|
2013 | 7.88 | 0 | 2.96 | 1 |
2014 | 9.3 | 1.61 | 2.85 | 1 |
2015 | 8.07 | 1.23 | 1.77 | 1 |
2016 | 10.82 | 1.92 | 1.79 | 1.89 |
2017 | 5.08 | 7.81 | 13.66 | 2.48 |
2018 | 53.92 | 9.66 | 18.33 | 2.79 |
2019 | 45.75 | 11.43 | 15.93 | 2.84 |
2020 | 42.24 | 10.51 | 13.11 | 2.59 |
2021 | 34.84 | 9.75 | 10.82 | 2.21 |
2022 | 36.99 | 13.2 | 11.8 | 2.27 |
ऐसा प्रतीत होता है कि 2013-2015 से, डेवलपर्स केवल एक ही उत्तर सबमिट करने के लिए प्रतिबंधित थे, जो सुपर लो नंबरों के लिए खाते में मदद करता है। हालांकि, 2019->2021 से प्रति उपयोगकर्ता नौकरियों की औसत संख्या कम हो गई , जो "अधिक सामान्यवादियों" सिद्धांत के विपरीत है।
यह भी ध्यान देने योग्य है, कि जैसे-जैसे साल बीतते गए, स्टैक ओवरफ्लो ने वास्तव में और अधिक विशिष्ट श्रेणियां जोड़ीं, जिन्हें मैंने तब इन व्यापक समूहों में समूहबद्ध करने की स्वतंत्रता ली।
तो वास्तव में अच्छे सबूत हैं कि डेवलपर्स अधिक विशेषज्ञता प्राप्त कर रहे हैं, या कम से कम यह है कि ऐसे और भी संभावित तरीके हैं जिनमें कोई विशेषज्ञ हो सकता है।
उस ने कहा, इस डेटा को देखने के बाद भी मुझे लगता है कि अभी भी एक अच्छा मामला बनाया जाना बाकी है कि बैक-एंड डेवलपर्स अधिक से अधिक "DevOps" काम करेंगे , खासकर छोटी कंपनियों में।
साल | type_data_science | डेटा_इंजीनियर | बैकएंड |
---|---|---|---|
2013 | 0 | 0 | 7.88 |
2014 | 0 | 0 | 9.3 |
2015 | 2.12 | 0.69 | 8.07 |
2016 | 3.83 | 0.7 | 10.82 |
2017 | 9.14 | 0 | 5.08 |
2018 | 7.17 | 0 | 53.92 |
2019 | 7.27 | 6.55 | 45.75 |
2020 | 6.19 | 5.8 | 42.24 |
2021 | 5.12 | 5 | 34.84 |
2022 | 4.67 | 4.91 | 36.99 |
यह मेरे लिए बहुत दिलचस्प है कि डेटा इंजीनियरिंग वास्तव में केवल 2019 में सर्वेक्षण डेटा में दिखाई देने लगी थी। तब तक, मुझे लगता है कि बैक-एंड इंजीनियरों और डेटा वैज्ञानिकों ने उस भूमिका को निगल लिया है। वह नई विशेषज्ञता निश्चित रूप से दिलचस्प है।
मशीन लर्निंग पिछले एक दशक में पूरी तरह से बढ़ा है, लेकिन ऐसा लगता है कि 2017 में "हाइप बबल" हो सकता है?
मैंने उस डेटा के बारे में अपनी व्यक्तिगत व्याख्याओं के बारे में बात की है जो मुझे सबसे दिलचस्प लगा, लेकिन यहां मेरे द्वारा एकत्र किए गए सभी डेटा हैं ताकि आप स्वयं इसका निरीक्षण कर सकें:
साल | avg_jobs_per_user | पूर्ण हो चुकी है | फ़्रंट एंड | बैकएंड | देवऑप्स | ऑप्स | गतिमान | डेस्कटॉप | अंतर्निहित | डेटा_विज्ञान | डेटा_इंजीनियर | खेल | प्रबंधन | क्यूए | शिक्षा | डिजाईन | विश्लेषक | बाजार | नज़रअंदाज़ करना |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2013 | 1 | 24.5 | 4.31 | 7.88 | 0 | 2.96 | 6.48 | 9.53 | 2.16 | 0 | 0 | 0 | 7.49 | 0 | 0 | 0 | 0 | 0 | 34.7 |
2014 | 1 | 25.72 | 5.02 | 9.3 | 1.61 | 2.85 | 7.57 | 9.43 | 2.42 | 0 | 0 | 0 | 5.9 | 0 | 0 | 0 | 0 | 0 | 30.18 |
2015 | 1 | 25.93 | 4.76 | 8.07 | 1.23 | 1.77 | 7.28 | 6.65 | 2.33 | 2.12 | 0.69 | 0.63 | 1.44 | 0.63 | 0 | 0.57 | 0 | 0.23 | 35.66 |
2016 | 1.89 | 37.88 | 5.13 | 10.82 | 1.92 | 1.79 | 7.39 | 6.05 | 2.26 | 3.83 | 0.7 | 0.52 | 10.04 | 0.68 | 0 | 0.59 | 1.02 | 0.21 | 98.65 |
2017 | 2.48 | 51.05 | 2.47 | 5.08 | 7.81 | 13.66 | 16.2 | 20.3 | 6.52 | 9.14 | 0 | 3.37 | 0.5 | 2.44 | 1.42 | 3.94 | 3.69 | 0.3 | 100 |
2018 | 2.79 | 44.87 | 35.22 | 53.92 | 9.66 | 18.33 | 19.02 | 15.99 | 4.87 | 7.17 | 0 | 4.7 | 7.99 | 6.27 | 3.68 | 12.16 | 7.65 | 1.13 | 26.63 |
2019 | 2.84 | 47.5 | 29.98 | 45.75 | 11.43 | 15.93 | 16.54 | 19.48 | 8.15 | 7.27 | 6.55 | 4.99 | 6.34 | 7.15 | 10.18 | 10.33 | 7.08 | 1.1 | 28.37 |
2020 | 2.59 | 42.08 | 28.38 | 42.24 | 10.51 | 13.11 | 14.71 | 18.28 | 7.37 | 6.19 | 5.8 | 4.33 | 5.54 | 6.12 | 8.67 | 8.25 | 6.24 | 1 | 30.18 |
2021 | 2.21 | 39.42 | 21.85 | 34.84 | 9.75 | 10.82 | 11.74 | 13.23 | 5.51 | 5.12 | 5 | 2.53 | 6.37 | 4.33 | 5.56 | 5.53 | 4.54 | 0.76 | 34.51 |
2022 | 2.27 | 39.17 | 21.72 | 36.99 | 13.2 | 11.8 | 10.42 | 13.03 | 5.35 | 4.67 | 4.91 | 2.51 | 10.44 | 4.23 | 5.78 | 5.14 | 4.37 | 0.71 | 32.06 |
स्टैक ओवरफ़्लो पर कच्चे सीएसवी डेटा का एक लिंक यहां दिया गया है।
यहाँ पूरी पायथन लिपि है जिसका उपयोग मैं संख्याओं को कम करने के लिए करता था। कोड मैलापन के लिए खेद है, मैंने कोड में एक टन समय नहीं डाला।
स्क्रिप्ट का सबसे दिलचस्प हिस्सा शायद नीचे के पास get_mapped_job
फ़ंक्शन है, यही वह जगह है जहां मैं चार्ट में शामिल कुछ में स्टैक ओवरफ़्लो उपयोगकर्ताओं द्वारा रिपोर्ट किए गए कई नौकरी प्रकारों को एकत्रित करता हूं।
import csv outpath = "csv/out.csv" type_devops = "devops" type_ops = "ops" type_backend = "backend" type_frontend = "frontend" type_mobile = "mobile" type_fullstack = "fullstack" type_desktop = "desktop" type_embedded = "embedded" type_data_science = "data_science" type_ignore = "ignore" type_management = "management" type_education = "education" type_design = "design" type_marketer = "marketer" type_data_engineer = "data_engineer" type_game = "game" type_analyst = "analyst" type_qa = "qa" def main(): files = [ (2013, [6]), (2014, [6]), (2015, [5]), (2016, [8, 9, 10]), (2017, [14, 15, 16, 17]), (2018, [9]), (2019, [12]), (2020, [13]), (2021, [11]), (2022, [11]), ] out_dict = {} jobs_per_user_dict = {} for f_tup in files: counts = {} path = f"csv/{f_tup[0]}.csv" print(f"generating report for {path}") out_dict[f_tup[0]]: {} with open(path, "r") as csvfile: rows = csv.reader(csvfile, delimiter=",") count = 0 rows_cpy = [] jobs_per_user = [] for row in rows: count += 1 rows_cpy.append(row) for row in rows_cpy: try: jobs = get_jobtext_from_cells(f_tup[1], row) mapped_jobs = set() for job in jobs: mapped_jobs.add(get_mapped_job(job)) jobs_per_user.append(mapped_jobs) for mapped_job in mapped_jobs: if mapped_job not in counts: counts[mapped_job] = 0 counts[mapped_job] += 1 except Exception as e: print(e) avg_jobs_per_user = 0 for user_jobs in jobs_per_user: avg_jobs_per_user += len(user_jobs) jobs_per_user_dict[f_tup[0]] = round( avg_jobs_per_user / len(jobs_per_user), 2 ) for job in counts: counts[job] /= count counts[job] *= 100 counts[job] = round(counts[job], 2) out_dict[f_tup[0]] = counts write_out(out_dict, jobs_per_user_dict) def get_jobtext_from_cells(indexes, row): if len(indexes) == 0: return [] job_texts = [] for i in indexes: cell = row[i] cell_job_texts = cell.split(";") job_texts += cell_job_texts return job_texts def write_out(out_dict, jobs_per_user_dict): types = [ type_fullstack, type_frontend, type_backend, type_devops, type_ops, type_mobile, type_desktop, type_embedded, type_data_science, type_data_engineer, type_game, type_management, type_qa, type_education, type_design, type_analyst, type_marketer, type_ignore, ] with open(outpath, "w") as csvfile: w = csv.writer(csvfile) w.writerow(["year", "avg_jobs_per_user"] + types) for year in out_dict: row = [year, jobs_per_user_dict[year]] for t in types: row.append(out_dict[year][t] if t in out_dict[year] else 0) w.writerow(row) def get_mapped_job(job): job = job.lower().strip() if job == "": return type_ignore if job == "devops specialist": return type_devops if job == "designer": return type_design if job == "c-suite executive": return type_management if job == "analyst or consultant": return type_analyst if job == "back-end developer": return type_backend if job == "windows phone": return type_mobile if job == "i don't work in tech": return type_ignore if job == "growth hacker": return type_marketer if job == "desktop developer": return type_desktop if job == "analyst": return type_analyst if job == "executive (vp of eng., cto, cio, etc.)": return type_management if job == "mobiledevelopertype": return type_mobile if job == "engineer, data": return type_data_engineer if job == "graphics programmer": return type_game if job == "systems administrator": return type_ops if job == "developer, game or graphics": return type_game if job == "desktop software developer": return type_desktop if job == "nondevelopertype": return type_ignore if job == "elected official": return type_ignore if job == "engineering manager": return type_management if job == "web developer": return type_fullstack if job == "machine learning specialist": return type_data_science if job == "data or business analyst": return type_analyst if job == "devtype": return type_fullstack if job == "response": return type_ignore if job == "developer, qa or test": return type_qa if job == "machine learning developer": return type_data_science if job == "developer, front-end": return type_frontend if job == "database administrator": return type_ops if job == "android": return type_mobile if job == "webdevelopertype": return type_fullstack if job == "blackberry": return type_mobile if job == "system administrator": return type_ops if job == "mobile developer - android": return type_mobile if job == "developertype": return type_fullstack if job == "ios": return type_mobile if job == "developer with a statistics or mathematics background": return type_ignore if job == "qa or test developer": return type_qa if job == "educator or academic researcher": return type_education if job == "engineer, site reliability": return type_devops if job == "marketing or sales professional": return type_marketer if job == "student": return type_ignore if job == "back-end web developer": return type_backend if job == "educator": return type_education if job == "front-end developer": return type_frontend if job == "developer, desktop or enterprise applications": return type_desktop if job == "senior executive/vp": return type_management if job == "occupation": return type_ignore if job == "scientist": return type_ignore if job == "developer, full-stack": return type_fullstack if job == "graphic designer": return type_design if job == "developer, embedded applications or devices": return type_embedded if job == "embedded application developer": return type_embedded if job == "quality assurance": return type_qa if job == "graphics programming": return type_game if job == "senior executive (c-suite, vp, etc.)": return type_management if job == "it staff / system administrator": return type_ops if job == "business intelligence or data warehousing expert": return type_data_engineer if job == "full stack web developer": return type_fullstack if job == "developer, mobile": return type_mobile if job == "front-end web developer": return type_frontend if job == "desktop applications developer": return type_desktop if job == "other (please specify):": return type_ignore if job == "mobile developer": return type_mobile if job == "devops": return type_devops if job == "enterprise level services developer": return type_ignore if job == "data scientist": return type_data_science if job == "executive (vp of eng, cto, cio, etc.)": return type_management if job == "mobile developer - ios": return type_mobile if job == "game or graphics developer": return type_game if job == "which of the following best describes your occupation?": return type_ignore if job == "other": return type_ignore if job == "desktop or enterprise applications developer": return type_desktop if job == "c-suite executive (ceo, cto, etc.)": return type_management if job == "embedded applications/devices developer": return type_embedded if job == "product manager": return type_ignore if job == "mobile application developer": return type_mobile if job == "mobile developer - windows phone": return type_mobile if job == "data scientist or machine learning specialist": return type_data_science if job == "educator or academic": return type_education if job == "embedded applications or devices developer": return type_embedded if job == "quality assurance engineer": return type_qa if job == "enterprise level services": return type_ignore if job == "full-stack developer": return type_fullstack if job == "na": return type_ignore if job == "academic researcher": return type_education if job == "manager of developers or team leader": return type_management if job == "marketing or sales manager": return type_marketer if job == "developer, back-end": return type_backend if job == "full-stack web developer": return type_fullstack if job == "designer or illustrator": return type_design if job == "programmer": return type_ignore if job == "developer": return type_ignore if job == "manager": return type_management if job == "engineer": return type_ignore if job == "sr. developer": return type_ignore if job == "full stack overflow developer": return type_fullstack if job == "ninja": return type_ignore if job == "mobile dev (android, ios, wp & multi-platform)": return type_mobile if job == "expert": return type_ignore if job == "rockstar": return type_ignore if job == "hacker": return type_ignore if job == "guru": return type_ignore if job == "self_identification": return type_ignore if job == "occupation_group": return type_ignore if job == "cloud infrastructure engineer": return type_devops if job == "project manager": return type_management if job == "security professional": return type_ops if job == "blockchain": return type_backend if ( job == "mathematics developers (data scientists, machine learning devs & devs with stats & math backgrounds)" ): return type_data_science raise Exception(f"job not mapped: {job}") main()
यहाँ भी प्रकाशित