چطور با بهتر کردن حافظهام، برنامه نویس بهتری شدم
جفری شِک، سنریگن — کار کردن مرا از پا انداخته بود. مهندس نرمافزاری بودم که سه سال بود در شغلش درجا میزد. حافظهام در افتضاح بودن همتا نداشت. نمیدانم که حافظهام به خاطر استرس اینقدر خراب بود، کمبود خواب داشتم، یا اینکه همیشه همینطور بد بوده و من خبر نداشتم. کار برایم تبدیل شده بود به چرخهای از «امروز دیگه قراره تغییر کنم»ها که به ردیتگردی، مدیومخوانی و هکرنیوزبازی با طعم بیزاری از خود ختم میشدند. سعی میکردم با این گشت و گذارها، دوپامینی که سر کار به دست نمیآوردم را جبران کنم؛ اما یک آدم شکستخورده بیش نبودم.
من دلم میخواست مهندس نرمافزار خوبی باشم؛ خوب نه، میخواستم شاهکار باشم! اما فقط متوسط بودم. بدترین بخش قضیه متوسط بودنم نبود، این بود که داشتم همه زورم را میزدم تا خوب باشم! شش روز هفته هر روز دوازده ساعت روی آن صندلی مینشستم و خودم را میکشتم که کدهای خارقالعاده پایتون بزنم؛ اما مرتب مجبور بودم مستندسازیها را چک کنم و مدام در چاله حواسپرتیهای اینترنتی گیر میافتادم. آدم شکست خوردهای بودم، اما یک شکستخورده کوشا.
آنوقت روبروی من همکارم کایل نشسته بود؛ کایلی که همزمان با من و مثل من برنامهنویسی را از صفر شروع کرد، مثل من سر کار آن را یاد گرفت. اما بعد از سه سال تلاش وقتی من هنوز داشتم تاتیتاتیکنان زمین میخوردم، او نه تنها میدوید، که بال هم درآورده بود و پرواز میکرد.
آرزویم بود که همه شرکتهای فناوری مرا بخواهند، که ده برابر پربازدهتر از یک مهندس نرمال باشم! یعنی همان چیزی که اهالی سیلیکون ولی به آن میگویند «مهندس ده برابری» (10X Engineer).در عوض داشتم درجا میزدم. آنوقت تک به تک همکارانی که سابقه بالای پانزده سال داشتند وِرد زبانشان این بود: «وای، کایل اولین مهندس دهبرابریه که تو عمرم دیدم!»
کایل فقط در روزهای هفته کار میکرد، از ساعت ۱۰ صبح تا ۴ عصر. همیشه کارش را زودتر از موعد تمام کرده بود. خودش به تنهایی باعث و بانی ۸۰٪ از خروجی تیم بود. اما چیزی که بیشتر از همه نمک روی زخم من میپاشید، این بود که کایل فقط ۶۰٪ مواقع داشت کار میکرد! اگر گفتید بقیه وقتش صرف چه میشد؟ بله، هکرنیوز، ردیت و مدیوم! من آن حلزونی بودم که دو سانت از دیوار بالا میرفت و یک سانت سقوط میکرد، آن وقت کایل خرگوش رشید و رعنایی بود که با یک جهش از روی دیوار میپرید.
کایل حتی یکی از عادتهای موثر مردمان موفق را هم نداشت. هیچوقت مدیتیشن نمیکرد. صبح و ظهر و شب مکدونالدز میخورد، اما پوست و استخوان بود. در عوض یک توانایی ابرقهرمانی داشت: یک حافظه تصویری بینظیر در سینتکسِ API و مستندسازی!
من هم دلم میخواست حافظه خوب داشته باشم. حسودیام میشد. مدتها بود که یک ذره هم پیشرفت شغلی نکرده بودم، و دیگر وقتش بود که یک چیزی تغییر کند. اینجا بود که سفر طولانی و متعهدانهام را در وادی تکرار فاصله دار (Spaced Repetition) آغاز کردم. برای مدت سه سال هر روز، یک تا سه ساعت روی تکرار فاصلهدار وقت گذاشتم. سفری سخت بود و بیرحمانه، اما لازمش داشتم.
تکرار فاصله دار چیست؟
تکرار فاصلهدار تکنیکی برای یادآوری است. در این تکنیک، شما مفاهیم را در فواصل بخصوص یادتان میآورید و به این ترتیب، میزان نگهداری آن اطلاعات در حافظه را به بهینهترین حالت میرسانید. تکرار فاصلهدار استراتژیای برای یادآوری اطلاعات به مغز است. این تکنیک میگوید که بهترین زمان برای به یادآوردن یک نکته، درست همان وقتی است که تازه شروع به فراموش کردن آن میکنیم. ذهن ما فراموشکار است، اما میتوانیم با به کار بستن یک استراتژی مناسب، کمی از فراموشکاریاش کم کنیم.
وقتی فواصل بین دفعات یادآوری رفته رفته زیاد میشوند، احتمال وارد شدن اطلاعات به حافظه طولانیمدت بیشتر میشود و احتمال فراموش کردن آنها، کمتر. به شکل بالا دقت کنید؛ میبینید چطور وقفهی قبل از هر یادآوری، از وقفهی یادآوری قبل خودش طولانیتر شده؟
بیایید فرض کنیم که شما در طول یک سال، شش بار فرصت دارید تا اسم خودتان را به بیل گیتس یادآوری کنید. اگر بیل بعد از یک سال اسم شما را یادش ماند، یک میلیون دلار به شما جایزه میدهد!
کدام روزها را برای یادآوری اسمتان به او انتخاب میکنید؟
- مدل ۱، مدل درس خواندن شب امتحانی: ۲۴ اسفند، ۲۵ اسفند، ۲۶ اسفند، ۲۷ اسفند، ۲۸ اسفند، ۲۹ اسفند
- مدل ۲، مدل دانشآموز نمونه: روز اول ماه با فاصلههای ۲ ماهه! در اول فروردین، اول خرداد، اول مرداد، الی آخر.
- مدل ۳، مدل تکرار فاصلهدار: اول فروردین، سوم فروردین، ۲۰ فروردین، ۲۸ اردیبهشت، ۱۵تیر، ۳۰ آذر.
با گزینه سوم (تکرار فاصلهدار) بیشترین شانس را برای ثبت کردن اسمتان در ذهن بیل گیتس خواهید داشت! (چقدر ما نویسندههایی که حرفهای بدیهی میزنیم روی اعصابیم، نه!؟)
اما چرا گزینه ۳ بهترین ثبت در حافظه را دارد؟
- مدل ۱. درس خواندن شب امتحانی به ندرت جواب میدهد؛ زیرا اطلاعات به محض اینکه از حافظه کوتاهمدت درآمدند، روانه سطل آشغال میشوند. چند تا از درسهای مدرسه که شب امتحان برایشان خواندید را الان یادتان مانده؟
- مدل ۲. یادآوری در فواصل زمانی منظم نسبتاً جواب میدهد، اما باید در هر بار یادآوری همه دانشتان را از نو مرور کنید. این کار نه ممکن است، نه خوش میگذرد، و نه اینکه کار و زندگی برای آدم میگذارد.
- مدل ۳. مغز ما با یادآوری در فواصل نمایی از همه بهتر کار میکند. جز در اپلیکیشنهای زبانآموزی (مثل Duolingo) و بین دانشجویان پزشکی، تکنیک تکرار فاصلهدار چندان رایج نیست. ولی حتی اگر به اندازه درس خواندن شب امتحانی کار خفنی نباشد، حداقل نتیجه میدهد. دانشجویان پزشکی با کمک این تکنیک است که کتابدرسیهای هزار صفحهای را یادشان نگه میدارند. اگر Duolingo از تکرار فاصلهدار استفاده میکند، برای این است که از آن جواب میگیرد. برندگان این مسابقههای حافظه را دیدهاید؟ خیلیهاشان طرفدار پر و پا قرص تکرار فاصلهدارند.
خب اگر تکرار فاصلهدار اینقدر شگفتانگیز است، پس چرا آدمهای کمی از آن استفاده میکنند؟
- چون مردم از وجود چنین تکنیکی خبر ندارند.
- چون حتی اگر این تکنیک را به کار ببرید، عادت دادن خودتان به مرور روزانه فلشکارتها کار سختی است.
- چون فلشکارت درست کردن کار رو اعصابی است. چه کسی خوشش میآید مدتها بنشیند و داخل یک اپلیکیشن یادداشت تایپ کند؟
- چون مردم خیلی دوست دارند در مورد بهتر کردن خود حرف بزنند، اما دلشان نمیخواهد بخش عرقدرآر کار را انجام بدهند.
- چون خیلی کار پرستیژداری نیست. اگر بخواهید با یک دختر/پسر رعنا سر قرار بروید، خیلی دوست نخواهید داشت که از عادت فلشکارت خواندنتان برایش تعریف کنید.
اما مهندسین نرمافزار هیچکدام این مشکلها را ندارند...
- شاید بیخبری از تکنیک تکرار فاصلهدار برای خیلیها ضرری نداشته باشد، اما از مهندسها انتظار میرود از ترندهای روز خبر داشته باشند. اگر اینطور نبود، هنوز داشتیم BitBucket و Adobe Flash استفاده میکردیم.
- مهندسها آدمهای عادتدوستیاند و راحت میتوانند عادت مرور فلشکارت را در خود ایجاد کنند. میتوانید همیشه در یک زمان بخصوص فلشکارتها را مرور کنید تا عادت شود؛ مثلاً به محض این که به شرکت رسیدید و سر میز نشستید، وقتی سوار مترو شدید، یا حتی در دستشویی درست قبل از رفتن به سراغ کندیکراش. وقتش شده که از پنجاه بار سرچ کردن «چطور کامیت گیت خود را اصلاح کنیم» در StackOverFlow دست بردارید!
- فلش کارت ساختن برای ما آنقدر هم سخت نیست؛ فقط کافی است به جای یادداشت کردن در Quiver، EverNote، Notion و غیره، یادداشتتان را در قالب فلش کارت ذخیره کنید.
- حتی اگر بهتر کردن خود کار عرقدرآری باشد، از قدیم گفتهاند برای اینکه مهندس نرمافزار خوبی باشی ز گهواره تا گور دانش بجوی.
- بیایید با هم رو راست باشیم؛ ما که با هیچ دختر/پسر رعنایی قرار نداریم!
پراستفادهترین اپلیکیشنها برای تکرار فاصلهدار، انکی (Anki) و سوپرممو (SuperMemo) هستند. با هردو این برنامهها میشود فلشکارت درست کرد و بعد طبق یک الگوریتم فاصلهدار، خود را آزمود. اگر سوال را اشتباه جواب دهید، برنامه همین فردا دوباره آن را از شما میپرسد. اگر درست جواب دهید، آن را به یک مدت بعدتر موکول میکند. من از انکی استفاده میکنم. به نظر میرسد که بین مهندسین نرمافزار، انکی رایجتر است. اپ موبایلش را دانلود کنید، هم آیفون دارد هم اندروید. اپ اندرویدش شاهکار است.
یادآوری چند اصطلاح (برای اینکه مبادا فراموش کنید):
- تکرار فاصلهدار، تکنیکی برای یادگیری است.
- اپلیکیشنهای انکی و سوپرمِمو از تکرار فاصلهدار استفاده میکنند.
- در انکی و سوپرممو، شما فلشکارت درست میکنید. بعد این اپلیکیشنها از شما در فواصل مختلف آزمون میگیرند.
- به کل مجموعه فلشکارتهای شما، Deck گفته میشود.
من خودم را عادت دادهام که هروقت چیزی در StackOverflow سرچ کردم، بلافاصله سوال و جواب/جوابهای آن را در انکی فلشکارت کنم.
تکرار فاصلهدار، مثل یک StackOverflow دمدستی و آفلاین است. (بله، قبلا Dash را امتحان کردهام!) در دوران پیشا-انکی، من مدام معادل سینتکسی آموختههای روزانهام را فراموش میکردم. درست است که همان زمان هم با انکی اطلاعات عمومی حفظ میکردم، اما هیچوقت فلشکارت برنامهنویسی درست نکرده بودم. چرا؟ به این دلیل:
- تنبلی. درست کردن فلشکارت برنامهنویسی خوب در انکی بعضا کار سختی است.
- به یاد سپردن فلشکارتی که داخلش کد دارد هم خیلی کار راحتی نیست. حفظ کردن پایتخت مغولستان (اولانباتور) سادهتر است تا حفظ کردن نحوه کپی کردن لیست فایلهای درایو خارجی به فایل txt با استفاده از xargs (جواب: cat list.txt | xargs -l{} mv /Volumes/External/{} /Desktop). خیلی اعصابخردکن است که یک کارت سخت را چند روز متوالی اشتباه جواب بدهی.
ولی در سه سال گذشته، من همه چیز را وارد انکی کردهام. Aliasهای بش، میانبرهای IDE، APIهای برنامهنویسی، مستندسازی، الگوهای طراحی، و غیره. با اینحال، به شما پیشنهاد نمیکنم که هر چیزی را به انکی اضافه کنید. فهرست اشتباهات من در انکی خودش یک پست جداگانه میطلبد...
مزایای استفاده از Anki برای تقویت حافظه
از وقتی به آغوش Anki پناه بردهام و یادآوری سریع زبان و APIهای فریمورک برایم مثل آب خوردن شده است، خدایان تمرکز و بازدهی بالاخره جواب دعاهای بیپایانم را دادهاند! سه سال قبل، روند کار من (که شاید برای شما هم آشنا باشد) اینطوری بود:
- شروع کد زدن
- گشتن در StackOverflow به دنبال سینتکسی که یادم رفته
- حواسپرتی. گشت وگذار در هکرنیوز.
- خب، هکرنیوز که هیچی نداشت. برویم سراغ ردیت؟
- تلاش برای تمرکز روی کار
- ناامیدی. بروم ببینم کسی مطلب جدیدی در هکرنیوز گذاشته؟
با مجهز شدن به حافظه خوب در سینتکس API، مستندسازی، و پایتخت کشورها، روند کارم ازین رو به آن رو شده است. این گراف فلشکارتهایی است که من در سال ۲۰۱۶ مرور کردهام؛ سالی پر از مرورهای کوتاه در وسط انبوهی از حواسپرتیهای طولانی:
و این یکی گراف امسال تا زمان نوشته شدن این متن است. انگار کم کم باید سرگرمی جدیدی پیدا کنم...
تعهد: شرط اول بهبود حافظه
درست است که در این تکنیک هر روز باید مرور کرد، اما اگر به آن متعهد بمانید تضمین میکنم که یک حافظه خوب در انتظارتان خواهد بود! اغلب کاربران به طور میانگین بیست دقیقه در روز برای مرور فلشکارتها وقت میگذارند. اگر کارت جدید اضافه نکنید (که در آن صورت باید بگویم تنبلخان، برو کارتهایت را اضافه کن) میانگین مدت مرورتان کم کم به صفر میل خواهد کرد؛ زیرا همه اطلاعاتی که وارد میکنید به مرور وارد حافظه بلندمدت میشود. دانستن این که با اضافه کردن اطلاعات به Anki دیگر آنها را از یاد نخواهید برد، اعتمادبنفسی به آدم میدهد که دیوانهکننده است.
جمعبندی
تکرار فاصلهدار مهمترین کاری است که برای بهبود زندگی/شغلم کردهام. متعهد ماندن به آن همیشه کار سادهای نیست. انجام دادنش تضمین نمیکند که مهندس بهتری شوید (استفاده از بهترین روشها و طراحیها نتیجهبخشتر از سینتکس است)، اما شما را مهندس تواناتری خواهد کرد. باورنکردنی است که وقتی آدم میتواند سریع سینتکس را به یاد بیاورد، چقدر کد زدنش سریعتر میشود. بله، بعضیوقتها هم نتیجه کار یک کد سریع افتضاح است، اما بهترین کدنویسها آنهاییاند که زیاد کد میزنند. زیاد کد زدن تنها راه تضمینی برای پیشرفت است.
از طرف دیگر، مغز ما اطلاعات متنوع و بیربط را یک جور خیلی جالب و غیرمستقیمی با هم ترکیب میکند. خیلی از فلشکارتهای من از پستهای وبلاگی و مقالات مهندسی هستند، اما دانستن تاریخچه RPC، SOAP، REST، و GraphQL باعث شده در طراحی و ساختار بهتر عمل کنم و تصمیمات مفیدتری بگیرم. البته خب، هنوز نفهمیدهام حفظ کردن الگوریتمهای درخت جستجوی دودویی کجا قرار است به کارم بیاید!
و اما... در مسیر برنامه نویس دهبرابری!
کل این قضیه با این آرزوی نامعقول من شروع شد که میخواستم یک «برنامهنویس دهبرابری» بشوم. انگار با خودم فکر میکردم قرار است به جایی برسم که برایم جشن فارغالتحصیلی بگیرند، مدرکم را دستم بدهند و بگویند «تبریک! از حالا به بعد دیگه تو یه برنامهنویس دهبرابری شدی!». آرزوی مسخرهای است. البته خب، اگر جایزه «دارنده بهترین راهکار سال» را به من بدهند خیلی هم بدم نمیآید!
حالا متوجه شدهام که واقعا نمیدانم برنامهنویس دهبرابری بودن یعنی چه. هیچ معیار سنجشی نیست که با آن بشود میزان خروجی، قدرت رهبری، کیفیت کد، و بدهی فنی (Technical Debt) را یکجا سنجید. وقتی که بلاخره احساس کردم دارم در خودم پیشرفت ایجاد میکنم، دیگر رفتن به دنبال «دهبرابری» شدن برایم بیمعنی شد. با بهتر کردن حافظهام، کنترل سرنوشتم را در دستان خودم گرفتم.
کایل هنوز هم چند برابر بهتر از بهترین حالت من است، اما من دیگر مشکلی با این قضیه ندارم.
ترجمه بر اساس:
"Chasing 10X: Leveraging A Poor Memory In Engineering" by Jeffrey Shek @ Senrigan
کوئرامگ مجلهای تخصصی برای توسعهدهندگان است که هر هفته با مطلبهایی در زمینه تکنولوژی، رشد فردی و آینده برنامهنویسی بهروزرسانی میشود. برای اطلاع از آخرین مطلبهای ما، میتوانید توئیتر یا کانال تلگرام ما را دنبال کنید.
مطلبی دیگر از این انتشارات
کامندلاین به فرمانِ شما: ۲۰ برنامه کاربردی برای برنامهنویسها
مطلبی دیگر از این انتشارات
قدمبهقدم تا توسعه فرانتاند: مهارتهای پایه
مطلبی دیگر از این انتشارات
هفت پدیده مهم روانشناسی در طراحی تجربه کاربری