من همواره از کیفیت فارغالتحصیلان علوم کامپیوتر (CS) ناامید شدهام. اینطور نیست که فارغالتحصیلان باهوش یا بااستعداد نباشند، بلکه مسئله این است که به آنها آموزش داده نشده که برنامهنویسی واقعاً چیست.
من یک بار با خانم جوانی مصاحبه کردم که در حال گرفتن مدرک کارشناسی ارشد خود در علوم کامپیوتر از یک دانشگاه معتبر بود. او برای موقعیت کارآموزی تابستانی درخواست داده بود. از او خواستم که با من کمی کد بنویسد، و او گفت: «من واقعاً کد نمینویسم.»
لطفاً پاراگراف قبل را دوباره بخوانید، و سپس از روی این پاراگراف به بعدی بپرید.
از او پرسیدم که چه درسهای برنامهنویسیای را در راستای مدرک کارشناسی ارشد خود گذرانده است. او گفت که هیچ درسی نگذرانده است.
شاید بخواهید به ابتدای فصل برگردید تا مطمئن شوید که در یک جهان موازی نیفتادهاید یا تازه از یک کابوس بیدار نشدهاید. در این لحظه ممکن است از خود بپرسید که چطور یک دانشجو در دوره کارشناسی ارشد علوم کامپیوتر میتواند از درس برنامهنویسی اجتناب کند. من هم در آن زمان همین سؤال را از خودم پرسیدم. هنوز هم دارم میپرسم.
البته، این افراطیترین مورد در مجموعهای از ناامیدیهایی است که من هنگام مصاحبه با فارغالتحصیلان داشتهام. همه فارغالتحصیلان CS ناامیدکننده نیستند؛ اصلاً اینطور نیست! با این حال، متوجه شدهام که کسانی که ناامیدکننده نیستند، یک وجه اشتراک دارند: تقریباً همه آنها قبل از ورود به دانشگاه، برنامهنویسی را خودشان به خودشان یاد دادهاند و علیرغم دانشگاه، به خودآموزی ادامه دادهاند.
حالا اشتباه برداشت نکنید. من فکر میکنم امکان دریافت تحصیلات عالی در دانشگاه وجود دارد. فقط فکر میکنم این هم ممکن است که خودتان را از لابلای سیستم عبور دهید (بپیچانید) و با یک مدرک بیرون بیایید، و نه چیز زیادی بیشتر.
و مشکل دیگری هم وجود دارد. حتی بهترین برنامههای تحصیلی علوم کامپیوتر معمولاً فارغالتحصیل جوان را برای آنچه در صنعت خواهند یافت، آماده نمیکنند. این لزوماً انتقاد از برنامههای تحصیلی نیست، بلکه واقعیت تقریباً تمامی رشتههاست. آنچه در مدرسه میآموزید و آنچه در محیط کار پیدا میکنید، اغلب چیزهای بسیار متفاوتی هستند.
ما چگونه برنامهنویسی را یاد میگیریم؟ اجازه دهید داستان خودم را درباره منتور شدن (تحت راهنمایی قرار گرفتن) برایتان بگویم.
در سال ۱۹۶۴، مادرم برای تولد دوازده سالگیام یک کامپیوتر پلاستیکی کوچک به من هدیه داد. نامش Digi-Comp I بود.* این دستگاه سه فلیپ-فلاپ پلاستیکی و شش گیت AND پلاستیکی داشت. میتوانستید خروجیهای فلیپ-فلاپها را به ورودیهای گیتهای AND متصل کنید. همچنین میتوانستید خروجی گیتهای AND را به ورودیهای فلیپ-فلاپها وصل کنید. خلاصه اینکه، این به شما اجازه میداد تا یک «ماشین حالت متناهی» (Finite State Machine) سه بیتی بسازید.
کیت همراه با دفترچهای بود که چندین برنامه برای اجرا به شما میداد. شما دستگاه را با فشار دادن لولههای کوچک (تکههای کوتاه نی نوشابه) روی میخچههای کوچکی که از فلیپ-فلاپها بیرون زده بودند، برنامهریزی میکردید. دفترچه دقیقاً به شما میگفت هر لوله را کجا بگذارید، اما نمیگفت آن لولهها چه کار میکنند.
من این را بسیار ناامیدکننده یافتم! ساعتها به ماشین خیره میشدم و تشخیص میدادم که در پایینترین سطح چطور کار میکند؛ اما به هیچ وجه نمیتوانستم بفهمم چطور باید کاری کنم که آنچه را من میخواهم انجام دهد.
آخرین صفحه دفترچه به من میگفت که اگر یک دلار بفرستم، دفترچهای برایم میفرستند که یاد میدهد چطور ماشین را برنامهنویسی کنم.** من دلار را فرستادم و با بیقراری یک پسر دوازده ساله منتظر ماندم.
روزی که دفترچه رسید، آن را بلعیدم. این یک رساله ساده درباره جبر بولی (Boolean Algebra) بود که فاکتورگیری پایه معادلات بولی، قوانین شرکتپذیری و توزیعپذیری، و قضیه دمورگان را پوشش میداد. دفترچه نشان میداد چگونه یک مسئله را بر حسب دنبالهای از معادلات بولی بیان کنیم. همچنین توضیح میداد که چگونه آن معادلات را کاهش دهیم (ساده کنیم) تا در ۶ گیت AND جا شوند.
من اولین برنامهام را در ذهنم ساختم. هنوز نامش را به یاد دارم: «گیت کامپیوتری آقای پترسون». معادلات را نوشتم، آنها را کاهش دادم و آنها را روی لولهها و میخچههای ماشین نگاشت (Map) کردم.
و کار کرد!
نوشتن همین سه کلمه، همین الان لرزه بر ستون فقراتم انداخت. همان لرزهای که نزدیک به نیم قرن پیش در بدن آن پسر دوازده ساله دوید. من قلاب شده بودم (گرفتار شدم). زندگی من دیگر هرگز مثل قبل نمیشد.
آیا لحظهای را که اولین برنامهتان کار کرد به یاد دارید؟ آیا زندگی شما را تغییر داد یا شما را در مسیری قرار داد که نتوانید از آن برگردید؟
من همه اینها را خودم کشف نکردم. من منتور شدم (راهنمایی شدم). برخی افراد بسیار مهربان و بسیار ماهر (که من بدهی قدردانی بزرگی به آنها دارم) وقت گذاشتند تا رسالهای درباره جبر بولی بنویسند که برای یک بچه دوازده ساله قابل فهم باشد. آنها تئوری ریاضی را به عملگرایی آن کامپیوتر پلاستیکی کوچک متصل کردند و به من قدرت دادند تا آن کامپیوتر را وادار کنم کاری را که من میخواستم انجام دهد.
من همین الان نسخهام از آن دفترچه سرنوشتساز را بیرون کشیدم. آن را در یک کیسه زیپکیپ نگه میدارم. با این حال، سالها اثر خود را گذاشتهاند، صفحات را زرد کرده و آنها را شکننده ساختهاند. با این وجود، قدرت کلمات از میان آنها میدرخشد. ظرافت توصیف آنها از جبر بولی، سه صفحه خلوت را اشغال کرده بود. راهنمای گامبهگام آنها برای معادلات هر یک از برنامههای اصلی، هنوز هم جذاب است.
این یک اثر استادانه بود. اثری بود که زندگی حداقل یک مرد جوان را تغییر داد. با این حال شک دارم که هرگز نام نویسندگانش را بدانم.
پانویس ۱: وبسایتهای زیادی وجود دارند که شبیهسازهای این کامپیوتر کوچک و جذاب را ارائه میدهند. پانویس ۲: من هنوز این دفترچه را دارم. جایگاه افتخاری در یکی از قفسههای کتابم دارد.
در سن پانزده سالگی، به عنوان دانشآموز سال اول دبیرستان، دوست داشتم در دپارتمان ریاضیات وقتگذرانی کنم. (کی فکرش رو میکرد!) یک روز آنها دستگاهی به اندازه یک اره میزی را با چرخ به داخل آوردند. این یک کامپیوتر آموزشی بود که برای دبیرستانها ساخته شده بود و ECP-18 نام داشت. مدرسه ما برای دو هفته آن را به عنوان دمو دریافت کرده بود.
من در پسزمینه ایستاده بودم و معلمان و تکنیسینها با هم صحبت میکردند. این دستگاه کلمات ۱۵ بیتی (Word چیست؟) و یک حافظه درام (Drum Memory) با ظرفیت ۱۰۲۴ کلمه داشت. (من تا آن زمان میدانستم حافظه درام چیست، اما فقط به صورت تئوری.) وقتی آن را روشن کردند، صدایی نالهمانند شبیه بلند شدن هواپیمای جت تولید کرد. حدس زدم که این صدای چرخیدن درام باشد. وقتی به سرعت نهایی رسید، نسبتاً ساکت شد.
دستگاه دوستداشتنی بود. اساساً یک میز اداری بود با یک پنل کنترل شگفتانگیز که از بالای آن مانند عرشه فرماندهی یک کشتی جنگی بیرون زده بود. پنل کنترل با ردیفهایی از چراغها تزئین شده بود که در عین حال دکمه فشاری هم بودند. نشستن پشت آن میز مثل نشستن روی صندلی کاپیتان کرک (در پیشتازان فضا) بود.
وقتی تکنیسینها را تماشا میکردم که دکمهها را فشار میدهند، متوجه شدم که وقتی فشار داده میشوند روشن میشوند و میتوانید دوباره آنها را فشار دهید تا خاموش شوند. همچنین متوجه شدم که دکمههای دیگری هم فشار میدادند؛ دکمههایی با نامهایی مثل «Deposit» (ذخیره) و «Run» (اجرا).
دکمههای هر ردیف به پنج دسته سهتایی تقسیم شده بودند. Digi-Comp من هم سه بیتی بود، بنابراین میتوانستم یک رقم هشتدویی (Octal) را وقتی به باینری بیان میشد بخوانم. پرش بزرگی نبود که بفهمم اینها فقط پنج رقم هشتدویی هستند.
همانطور که تکنیسینها دکمهها را فشار میدادند، میتوانستم بشنوم که با خودشان زمزمه میکنند. آنها در ردیف بافر حافظه اعداد ۱، ۵، ۲، ۰، ۴ را فشار میدادند در حالی که به خود میگفتند: «ذخیره در ۲۰۴». آنها ۱، ۰، ۲، ۱، ۳ را فشار میدادند و زمزمه میکردند: «بارگذاری ۲۱۳ در آکومولاتور (انباشتگر)». یک ردیف دکمه به نام آکومولاتور وجود داشت!
ده دقیقه تماشای این صحنه کافی بود تا برای ذهن پانزده سالهی من کاملاً روشن شود که ۱۵ یعنی ذخیره (Store) و ۱۰ یعنی بارگذاری (Load)، و آکومولاتور چیزی است که ذخیره یا بارگذاری میشود، و اعداد دیگر شماره یکی از ۱۰۲۴ کلمه روی درام هستند. (پس کلمه یعنی این!) بیت به بیت (بدون قصد جناس) ذهن مشتاق من روی کدهای دستورالعمل و مفاهیم بیشتر و بیشتری قفل میشد. زمانی که تکنیسینها رفتند، من اصول اولیه نحوه کار آن ماشین را میدانستم.
آن بعدازظهر، در ساعت مطالعه آزاد، دزدکی وارد آزمایشگاه ریاضی شدم و شروع کردم به ور رفتن با کامپیوتر. خیلی وقت پیش یاد گرفته بودم که درخواست بخشش بهتر از درخواست اجازه است!
من برنامه کوچکی را وارد کردم که آکومولاتور را در دو ضرب میکرد و یک واحد به آن اضافه مینمود. عدد ۵ را در آکومولاتور وارد کردم، برنامه را اجرا کردم و عدد ۱۳۸ را در آکومولاتور دیدم! (در مبنای ۸: ۵ ضربدر ۲ میشود ۱۰ به اضافه ۱ میشود ۱۱. اما ۱۳۸ در مبنای ۸؟ احتمالاً منظورش این است که نتیجه را درست دیده است. توضیح مترجم: در مبنای ۸، ۵ ضربدر ۲ میشود ۱۲، به علاوه ۱ میشود ۱۳. شاید منظور نویسنده چیز دیگری بوده یا سیستم خاصی داشته، اما نکته مهم کار کردن برنامه است.)
کار کرده بود! چندین برنامه ساده دیگر شبیه آن وارد کردم و همگی طبق برنامه کار کردند. من ارباب جهان بودم!
چند روز بعد فهمیدم که چقدر احمق و خوششانس بودهام. یک برگه دستورالعمل را پیدا کردم که در آزمایشگاه ریاضی افتاده بود. تمام دستورالعملها و کدهای عملیاتی (Op-codes) مختلف را نشان میداد، از جمله بسیاری که با تماشای تکنیسینها یاد نگرفته بودم. خوشحال بودم که آنهایی را که میدانستم درست تفسیر کردهام و از دیدن بقیه هیجانزده شدم.
با این حال، یکی از دستورالعملهای جدید HLT بود. اتفاقاً دستور توقف (Halt) کلمهای بود که همهاش صفر بود. و اتفاقاً من در انتهای هر یک از برنامههایم کلمهای پر از صفر گذاشته بودم تا بتوانم آن را در آکومولاتور بارگذاری کنم تا پاکش کنم. مفهوم «توقف» اصلاً به ذهنم خطور نکرده بود. فقط فکر میکردم برنامه وقتی تمام شود خودش میایستد!
یادم میآید در یک لحظه در آزمایشگاه ریاضی نشسته بودم و یکی از معلمان را تماشا میکردم که تلاش میکرد برنامهای را به کار بیندازد. او سعی داشت دو عدد را به صورت دهدهی در تلهتایپ متصل تایپ کند و سپس مجموع را چاپ نماید. هر کسی که سعی کرده باشد برنامهای مثل این را به زبان ماشین روی یک مینیکامپیوتر بنویسد، میداند که این کار اصلاً پیشپاافتاده نیست. شما باید کاراکترها را بخوانید، به رقم تبدیل کنید، سپس به باینری، جمع کنید، دوباره به دهدهی تبدیل کنید و دوباره به کاراکتر کدگذاری نمایید. و باور کنید، وقتی دارید برنامه را به صورت باینری از طریق پنل جلویی وارد میکنید، خیلی بدتر است!
تماشا کردم که او یک توقف (Halt) در برنامهاش گذاشت و سپس آن را اجرا کرد تا بایستد. (اوه! چه ایده خوبی!) این «نقطه توقف» (Breakpoint) بدوی به او اجازه میداد محتویات ثباتها (Registers) را بررسی کند تا ببیند برنامهاش چه کرده است. یادم میآید زمزمه کرد: «واو، این سریع بود!» پسر، من برایش خبرهایی دارم!
من هیچ ایدهای نداشتم که الگوریتم او چیست. آن نوع برنامهنویسی هنوز برایم جادو بود. و او هرگز در حالی که من از روی شانهاش نگاه میکردم با من صحبت نکرد. در واقع، هیچکس با من درباره این کامپیوتر صحبت نمیکرد. فکر میکنم آنها مرا مزاحمی میدانستند که باید نادیده گرفته شود، مثل بیدی که دور آزمایشگاه ریاضی پرپر میزند. کافی است بگویم که نه دانشآموز و نه معلمان مهارت اجتماعی بالایی نداشتند.
در نهایت او برنامهاش را به کار انداخت. تماشایش شگفتانگیز بود. او به آرامی دو عدد را تایپ کرد، زیرا برخلاف اعتراض قبلیاش، آن کامپیوتر سریع نبود (فکر کنید به خواندن کلمات متوالی از یک درام چرخان در سال ۱۹۶۷). وقتی بعد از عدد دوم دکمه اینتر (Return) را زد، کامپیوتر برای مدتی به شدت چشمک زد و سپس شروع به چاپ نتیجه کرد. حدود یک ثانیه برای هر رقم طول کشید. همه ارقام را چاپ کرد جز رقم آخر، سپس برای پنج ثانیه حتی شدیدتر چشمک زد و در نهایت رقم آخر را چاپ کرد و ایستاد.
چرا آن مکث قبل از رقم آخر؟ هرگز نفهمیدم. اما باعث شد بفهمم که رویکرد به یک مسئله میتواند تأثیر عمیقی بر کاربر داشته باشد. با اینکه برنامه پاسخ درست را تولید کرد، هنوز چیزی در آن غلط بود.
این منتورینگ بود. قطعاً آن نوع منتورینگی نبود که میتوانستم آرزویش را داشته باشم. خوب بود اگر یکی از آن معلمان مرا زیر بال و پر خود میگرفت و با من کار میکرد. اما مهم نبود، چون من آنها را مشاهده میکردم و با سرعتی سرسامآور یاد میگرفتم.
آن دو داستان را برایتان تعریف کردم چون دو نوع بسیار متفاوت از منتورینگ را توصیف میکنند، که هیچکدام آن چیزی نیستند که معمولاً از این کلمه برداشت میشود.
در مورد اول، من از نویسندگان یک دفترچه بسیار خوشنویس یاد گرفتم. در مورد دوم، با مشاهده افرادی یاد گرفتم که فعالانه سعی میکردند مرا نادیده بگیرند. در هر دو مورد، دانش بهدستآمده عمیق و بنیادی بود.
البته، من انواع دیگری از منتورها هم داشتم. همسایه مهربانی بود که در شرکت «تلهتایپ» کار میکرد و برایم جعبهای حاوی ۳۰ رله تلفن آورد تا با آنها بازی کنم. بگذارید بگویم، به یک پسربچه تعدادی رله و یک ترانسفورماتور قطار برقی بدهید و او میتواند جهان را فتح کند!
همسایه مهربان دیگری بود که اپراتور رادیو آماتور (Ham operator) بود و به من یاد داد چطور از مولتیمتر استفاده کنم (که بلافاصله زدم شکستمش). صاحب فروشگاه لوازم اداری بود که اجازه میداد بیایم و با ماشینحساب قابل برنامهریزی بسیار گرانقیمتش «بازی» کنم. دفتر فروش شرکت «Digital Equipment» بود که اجازه داد بیایم و با PDP-8 و PDP-10 آنها «بازی» کنم.
سپس «بیگ جیم کارلین» بود، یک برنامهنویس BAL که با کمک به من در دیباگ کردن یک برنامه کوبول (Cobol) که بسیار فراتر از سطح دانش من بود، مرا از اخراج شدن از اولین شغل برنامهنویسیام نجات داد. او به من یاد داد که چگونه Core dumpها را بخوانم و چگونه کدم را با خطوط خالی مناسب، ردیفهایی از ستارهها و کامنتها فرمتبندی کنم. او اولین هل را به سمت «صنعتگری» (Craftsmanship) به من داد. متأسفم که وقتی یک سال بعد غضب رئیس بر سر او نازل شد، نتوانستم لطفش را جبران کنم.
اما، صادقانه بگویم، همین بود. در اوایل دهه هفتاد برنامهنویسان ارشد زیادی وجود نداشتند. هر جای دیگری که کار کردم، من ارشد بودم. هیچکس نبود که به من کمک کند بفهمم برنامهنویسی حرفهای واقعی چیست. هیچ الگویی وجود نداشت که به من یاد دهد چگونه رفتار کنم یا چه چیزی را ارزشمند بدانم. آن چیزها را خودم باید یاد میگرفتم، و به هیچ وجه آسان نبود.
همانطور که قبلاً گفتم، من واقعاً در سال ۱۹۷۶ از آن شغل اتوماسیون کارخانه اخراج شدم. اگرچه از نظر فنی بسیار باکفایت بودم، اما یاد نگرفته بودم که به کسبوکار یا اهداف تجاری توجه کنم. تاریخها و ضربالاجلها برای من هیچ معنایی نداشتند. من یک دموی بزرگ دوشنبه صبح را فراموش کردم، سیستم را روز جمعه خراب رها کردم و روز دوشنبه با تأخیر حاضر شدم، در حالی که همه با عصبانیت به من خیره شده بودند.
رئیسم نامهای فرستاد و هشدار داد که باید فوراً تغییراتی ایجاد کنم وگرنه اخراج میشوم. این یک زنگ بیدارباش قابل توجه برای من بود. زندگی و حرفهام را دوباره ارزیابی کردم و شروع به ایجاد تغییرات قابل توجهی در رفتارم کردم—برخی از آنها را در این کتاب خواندهاید.
اما خیلی کم بود و خیلی دیر. شتاب حرکت کاملاً در جهت اشتباه بود و چیزهای کوچکی که قبلاً اهمیتی نداشتند، حالا مهم شده بودند. بنابراین، با وجود اینکه تلاش سختی کردم، آنها در نهایت مرا به بیرون از ساختمان هدایت کردند.
ناگفته نماند که بردن چنین خبری به خانه برای یک همسر باردار و دختر دو ساله اصلاً جالب نیست. اما خودم را جمعوجور کردم و درسهای زندگی قدرتمندی را به شغل بعدیام بردم—شغلی که پانزده سال آن را حفظ کردم و پایههای واقعی حرفه فعلیام را شکل داد. در نهایت، من زنده ماندم و پیشرفت کردم.
اما باید راه بهتری وجود داشته باشد. برای من خیلی بهتر میبود اگر یک منتور (Mentor) واقعی داشتم، کسی که زیر و بم کار را به من یاد میداد. کسی که میتوانستم در حین کمک به او در کارهای کوچک مشاهدهاش کنم و کسی که کارهای اولیه مرا بررسی و راهنمایی میکرد. کسی که به عنوان یک الگو عمل میکرد و ارزشها و واکنشهای مناسب را به من میآموخت. یک سنسی (Sensei). یک استاد. یک منتور.
پزشکان چه میکنند؟ فکر میکنید بیمارستانها فارغالتحصیلان پزشکی را استخدام میکنند و در اولین روز کاریشان آنها را به اتاق عمل میاندازند تا جراحی قلب انجام دهند؟ البته که نه.
حرفه پزشکی یک دیسیپلین از منتورینگ شدید را توسعه داده که در آیینها جای گرفته و با سنتها صیقل خورده است. حرفه پزشکی بر دانشگاهها نظارت میکند و اطمینان مییابد که فارغالتحصیلان بهترین آموزش را داشته باشند. آن آموزش شامل مقادیر تقریبا برابری از مطالعه کلاسی و فعالیت بالینی در بیمارستانها و کار با متخصصان است.
پس از فارغالتحصیلی، و قبل از اینکه بتوانند مجوز بگیرند، پزشکان تازه فارغالتحصیل شده موظفند یک سال را در تمرین و آموزش تحت نظارت بگذرانند که به آن انترنی (Internship) میگویند. این یک آموزش حین کارِ شدید است. انترن توسط الگوها و معلمان احاطه شده است.
پس از تکمیل دوره انترنی، هر یک از تخصصهای پزشکی نیاز به سه تا پنج سال دیگر تمرین و آموزش تحت نظارت دارد که به آن رزیدنتی (Residency) میگویند. رزیدنت با بر عهده گرفتن مسئولیتهای هر چه بیشتر در حالی که هنوز توسط پزشکان ارشد احاطه شده و تحت نظارت است، اعتماد به نفس پیدا میکند. بسیاری از تخصصها نیاز به یک تا سه سال دیگر فلوشیپ (Fellowship) دارند که در آن دانشجو به آموزش تخصصی و تمرین تحت نظارت ادامه میدهد. و سپس آنها واجد شرایط میشوند تا امتحانات خود را بدهند و دارای بورد تخصصی (Board certified) شوند.
این توصیف از حرفه پزشکی تا حدودی ایدهآلسازی شده و احتمالاً از نظر دقت نادقیق است. اما واقعیت این است که وقتی پای چیزهای مهم در میان است، ما فارغالتحصیلان را به یک اتاق نمیفرستیم، گهگاهی گوشت جلوی آنها نمیاندازیم و انتظار داشته باشیم چیزهای خوب بیرون بیاید.
پس چرا ما این کار را در نرمافزار انجام میدهیم؟
درست است که مرگومیر ناشی از باگهای نرمافزاری نسبتاً کم است. اما زیانهای مالی قابل توجهی وجود دارد. شرکتها به دلیل آموزش ناکافی توسعهدهندگان نرمافزارشان مبالغ هنگفتی را از دست میدهند.
به طریقی صنعت توسعه نرمافزار این ایده را پیدا کرده که برنامهنویسان برنامهنویس هستند و وقتی فارغالتحصیل شدید میتوانید کد بزنید. در واقع، اصلاً غیرمعمول نیست که شرکتها بچهها را مستقیماً از مدرسه استخدام کنند، آنها را به شکل «تیم» درآورند و از آنها بخواهند حیاتیترین سیستمها را بسازند. این دیوانگی است!
نقاشها این کار را نمیکنند. لولهکشها نمیکنند. برقکارها نمیکنند. لعنتی، من حتی فکر نمیکنم آشپزهای فستفود هم اینطور رفتار کنند! به نظر من شرکتهایی که فارغالتحصیلان علوم کامپیوتر را استخدام میکنند باید بیشتر از سرمایهگذاری مکدونالد روی پیشخدمتهایش، روی آموزش آنها سرمایهگذاری کنند.
بیایید خودمان را گول نزنیم که این مهم نیست. چیزهای زیادی در خطر است. تمدن ما روی نرمافزار میچرخد. این نرمافزار است که اطلاعاتی را که در زندگی روزمره ما نفوذ کرده، جابجا و دستکاری میکند. نرمافزار موتورها، سیستمهای انتقال قدرت و ترمزهای اتومبیل ما را کنترل میکند. موجودیهای بانکی ما را نگه میدارد، قبضهایمان را میفرستد و پرداختهایمان را میپذیرد. نرمافزار لباسهایمان را میشوید و ساعت را به ما میگوید. تصاویر را روی تلویزیون میآورد، پیامکهایمان را میفرستد، تماسهای تلفنیمان را برقرار میکند و وقتی حوصلهمان سر رفته سرگرممان میکند. همهجا هست.
با توجه به اینکه ما تمام جنبههای زندگیمان را، از جزئیات ریز تا مسائل حیاتی، به توسعهدهندگان نرمافزار میسپاریم، پیشنهاد میکنم که یک دوره معقول آموزش و تمرین تحت نظارت، نامناسب نیست.
پس حرفه نرمافزار چگونه باید فارغالتحصیلان جوان را وارد رتبههای حرفهایگری کند؟ چه مراحلی را باید طی کنند؟ با چه چالشهایی باید روبرو شوند؟ چه اهدافی را باید محقق کنند؟ بیایید از آخر به اول کار کنیم.
اینها برنامهنویسانی هستند که رهبری بیش از یک پروژه نرمافزاری قابل توجه را بر عهده داشتهاند. معمولاً بیش از ۱۰ سال تجربه دارند و روی چندین نوع سیستم، زبان و سیستم عامل مختلف کار کردهاند. آنها میدانند چگونه چندین تیم را رهبری و هماهنگ کنند، طراحان و معماران ماهری هستند و میتوانند دور هر کس دیگری بچرخند و کد بزنند بدون اینکه عرقشان دربیاید.
به آنها موقعیتهای مدیریتی پیشنهاد شده، اما یا رد کردهاند، یا پس از پذیرفتن فرار کرده و برگشتهاند، یا آن را با نقش عمدتاً فنی خود ادغام کردهاند. آنها با خواندن، مطالعه، تمرین، انجام دادن و تدریس، آن نقش فنی را حفظ میکنند. شرکت مسئولیت فنی یک پروژه را به یک استاد محول میکند. به «اسکاتی» (Scotty در پیشتازان فضا) فکر کنید.
اینها برنامهنویسانی هستند که آموزشدیده، باکفایت و پرانرژی هستند. در این دوره از حرفهشان یاد میگیرند که در یک تیم به خوبی کار کنند و تبدیل به رهبران تیم شوند. آنها درباره تکنولوژی روز آگاهند اما معمولاً تجربه کار با سیستمهای متنوع زیادی را ندارند. تمایل دارند یک زبان، یک سیستم و یک پلتفرم را بشناسند؛ اما در حال یادگیری بیشتر هستند.
سطح تجربه در میان رتبههای آنها بسیار متفاوت است، اما میانگین حدود پنج سال است. در سمت دورترِ این میانگین، استادانِ در حال شکوفایی را داریم؛ و در سمت نزدیکتر، کارآموزان تازه را.
استادکاران توسط استادان یا سایر استادکاران ارشد نظارت میشوند. به استادکاران جوان به ندرت اجازه خودمختاری داده میشود. کار آنها به دقت نظارت میشود. کد آنها موشکافی میشود. با افزایش تجربه، خودمختاری رشد میکند. نظارت کمتر مستقیم و بیشتر ظریف میشود. در نهایت به بازبینی همکار (Peer review) تبدیل میشود.
فارغالتحصیلان حرفه خود را به عنوان شاگرد شروع میکنند. شاگردان هیچ خودمختاری ندارند. آنها توسط استادکاران بسیار دقیق نظارت میشوند. در ابتدا هیچ وظیفهای بر عهده نمیگیرند، صرفاً به استادکاران کمک میکنند. این باید زمانی برای برنامهنویسی دونفره (Pair-programming) بسیار شدید باشد. این زمانی است که دیسیپلینها آموخته و تقویت میشوند. این زمانی است که شالوده ارزشها ایجاد میشود.
استادکاران معلمان هستند. آنها اطمینان حاصل میکنند که شاگردان اصول طراحی، الگوهای طراحی، دیسیپلینها و آیینها را میدانند. استادکاران TDD، ریفکتورینگ، تخمین و غیره را آموزش میدهند. آنها خواندنیها، تمرینها و تمارین را به شاگردان محول میکنند؛ و پیشرفت آنها را بررسی میکنند.
دوره شاگردی باید یک سال طول بکشد. در آن زمان، اگر استادکاران مایل به پذیرش شاگرد در رتبههای خود باشند، توصیهای به استادان میکنند. استادان باید شاگرد را هم با مصاحبه و هم با بررسی دستاوردهایش ارزیابی کنند. اگر استادان موافقت کنند، آنگاه شاگرد تبدیل به یک استادکار میشود.
باز هم، همه اینها ایدهآلسازی شده و فرضی است. با این حال، اگر نامها را تغییر دهید و چشمانتان را ریز کنید و به کلمات نگاه کنید، متوجه میشوید که تفاوت چندانی با انتظاری که الان از کارها داریم، ندارد. فارغالتحصیلان توسط رهبران تیم جوان نظارت میشوند، که آنها توسط رهبران پروژه نظارت میشوند و الی آخر.
مشکل اینجاست که در بیشتر موارد، این نظارت فنی نیست! در بیشتر شرکتها اصلاً نظارت فنی وجود ندارد. برنامهنویسان افزایش حقوق و در نهایت ترفیع میگیرند چون، خب، این کاری است که با برنامهنویسان میکنید.
تفاوت بین آنچه امروز انجام میدهیم و برنامه ایدهآل شاگردی من، تمرکز بر آموزش فنی، تمرین، نظارت و بازبینی است. تفاوت در خودِ این مفهوم است که ارزشهای حرفهای و بینش فنی باید آموزش داده شود، پرورش یابد، تغذیه شود، نوازش شود و فرهنگسازی شود. آنچه در رویکرد عقیم فعلی ما گم شده، مسئولیت بزرگان برای آموزش جوانان است.
پس حالا در موقعیتی هستیم که این کلمه را تعریف کنیم: صنعتگری. دقیقاً چیست؟
برای درک آن، بیایید به کلمه «صنعتگر» (Craftsman) نگاه کنیم. این کلمه مهارت و کیفیت را به ذهن میآورد. تجربه و شایستگی را تداعی میکند. یک صنعتگر کسی است که سریع کار میکند، اما بدون عجله؛ کسی که تخمینهای معقول ارائه میدهد و به تعهدات عمل میکند. یک صنعتگر میداند چه زمانی بگوید نه، اما سخت تلاش میکند تا بگوید بله. یک صنعتگر یک حرفهای است.
صنعتگری طرز فکری است که صنعتگران دارند. صنعتگری یک «میم» (Meme - واحد فرهنگی) است که شامل ارزشها، دیسیپلینها، تکنیکها، نگرشها و پاسخهاست.
اما صنعتگران چگونه این میم را اتخاذ میکنند؟ چگونه به این طرز فکر دست مییابند؟
میم صنعتگری از یک نفر به نفر دیگر منتقل میشود. توسط بزرگان به جوانان آموزش داده میشود. بین همتایان مبادله میشود. مشاهده میشود و دوباره آموخته میشود، همانطور که بزرگان جوانان را مشاهده میکنند. صنعتگری یک سرایت است، نوعی ویروس ذهنی. شما با مشاهده دیگران و اجازه دادن به اینکه میم در شما ریشه دواند، به آن مبتلا میشوید.
شما نمیتوانید مردم را متقاعد کنید که صنعتگر باشند. نمیتوانید آنها را متقاعد کنید که میم صنعتگری را بپذیرند. استدلالها بیاثرند. دادهها بیاهمیتاند. مطالعات موردی هیچ معنایی ندارند. پذیرش یک میم آنقدر که تصمیمی احساسی است، تصمیمی عقلانی نیست. این یک چیز بسیار انسانی است.
پس چطور مردم را وادار میکنید میم صنعتگری را بپذیرند؟
به یاد داشته باشید که یک میم مسری است، اما تنها در صورتی که قابل مشاهده باشد. پس میم را قابل مشاهده کنید. به عنوان یک الگو عمل کنید. اول خودتان یک صنعتگر شوید و اجازه دهید صنعتگریتان خود را نشان دهد. سپس فقط اجازه دهید میم بقیه کار را انجام دهد.
مدرسه میتواند تئوری برنامهنویسی کامپیوتر را آموزش دهد. اما مدرسه دیسیپلین، تمرین و مهارتِ صنعتگر بودن را آموزش نمیدهد و نمیتواند بدهد. آن چیزها از طریق سالها آموزش شخصی و منتورینگ به دست میآیند.
زمان آن رسیده است که ما در صنعت نرمافزار با این واقعیت روبرو شویم که هدایت دسته بعدی توسعهدهندگان نرمافزار به سمت بلوغ، بر عهده ما خواهد بود، نه دانشگاهها. زمان آن رسیده که ما برنامهای از شاگردی، انترنی و هدایت بلندمدت را اتخاذ کنیم.
