همه چیز از یک اطلاعیه شروع شد!

درباره‌ٔ من

من، مریم میرزایی، حدود یکسال و نیم است که به عنوان Android Developer در تیم لیستینگ خودرو در دیوار فعالیت می‌کنم. ورودی ۹۶ رشته‌ی مهندسی کامپیوتر دانشگاه تهران هستم. قبل از تجربه‌م در دیوار سابقه‌ی کار در زمینه اندروید یا فیلد دیگری نداشتم و دیوار اولین تجربه‌ی کاری من بود که با کارآموزی آغاز شد. با اینکه تجربه کاری نداشتم، اما در دیوار این فرصت را پیدا کردم که با افرادی با دانش‌ فنی بالا در چپتر اندروید همکار شوم، چیزهای بسیاری یاد بگیرم و در فضای کار تیمی و اعتماد متقابل کار کنم.

شروع کارآموزی

با توجه به اینکه قبل از دیوار هیچ پیش‌زمینه‌ای از اندروید نداشتم، شروع این داستان از اطلاعیه‌ی برگزاری یک دوره‌ی آموزش مقدماتی اندروید بود که توسط انجمن ACM دانشگاه تهران برگزار می‌شد و مدرس این دوره یکی از چپتر لیدرهای اندورید هلدینگ هزاردستان (که دیوار یکی از محصولات آن است) بود. در این دوره سینتکس‌های ابتدایی زبان کاتلین و همچنین بیسیک‌های اندروید آموزش داده شد. در این مدت با RecyclerView که یکی از مهم‌ترین مباحث اندروید هست آشنا شدیم و با یک api تمرینی توانستیم یک لیست interactive را از سروری دریافت کرده و آن‌ها را نمایش دهیم. علاوه بر این با دیزاین کردن ساختار یک پروژه، توانستیم با پکیج بندی درست نیز آشنا شویم.

بعد از پایان دوره، همه‌ی ما می‌توانستیم با ارسال رزومه‌‌ی خود برای پوزیشن کارآموزی در شرکت اپلای کنیم. بعد از پذیرفته شدن رزومه‌ام تسکی دو هفته‌ای از مباحثی که در دوره آموزش داده شده بود، به من محول شد. این تسک آموزش‌ها را در قالب یک تسک چالشی‌تر شامل Nested RecylerViewها و ترکیب افقی و عمودی بودن آن‌ها به خوبی پوشش می‌داد. بعد از بررسی شدن و پذیرش کد‌ها توانستم به عنوان کارآموز در هلدینگ هزاردستان مشغول به کار شوم.

دورهٔ کارآموزی

در این دوره پس از بستن قرارداد کارآموزی، در کنار سایر کارآموزان کار را شروع کردیم و سیستم و تجهیزات کار هم در اختیار ما قرار داده شد. دو روز در هفته هم یکی از توسعه دهندگان اندروید شرکت یکی از مباحث مهم اندروید را برای ما ارائه می‌داد. مسائلی مثل Dependecy Injection, Clean Code, Reactive Programming, ConstraintLayout و Unit Test و Integration Test در این دوره ما آموزش داده شد. در هر یک از این ارائه‌ها لینک‌های داکیومنت‌های خوب و کدهای نمونه در اختیار ما قرار می‌گرفت تا بتوانیم مطالعه بیشتری داشته باشیم.

در این دوره در فضایی که مخصوص به کارآموزان در شرکت آماده شده بود تمرین می‌کردیم. به دلیل اینکه در کنار محل کار کارآموزان، توسعه‌دهندگان اصلی محصول بودند به راحتی می‌توانستم سوالات و مشکلات فنی‌ای را که در مسیر تمرین و یادگیری داشتم، بپرسم و بهترین راه‌حل را برای مسائل پیدا کنم.

در پایان یک ماه فرصت داشتیم تا برای مصاحبه نهایی که شامل دو بخش تئوری و عملی بود آماده شویم. در مصاحبه‌ تئوری، مدرس دوره و چپتر لیدر اندروید شرکت حضور داشتند و در مورد fundamentalهای اندروید صحبت کردیم و در مصاحبه عملی یک پروژه را با تمامی کامپوننت‌هایی که در دوره یاد گرفته بودیم پیاده کردیم.

برای جزییات بیشتر مواردی که در این دوره آموزش داده شد، می‌توانید از لینک گیت‌هاب پروژه تمرینی استفاده کنید.

ورود به دیوار و منتورشیپ

بعد از کارآموزی و قبول شدن در مصاحبه، در دیوار مشغول به کار شدم. روز اولی که وارد دیوار شدم مراحل آنبوردینگ و آشنایی با فضای کار انجام شد. در این روز با ارزش‌های اصلی شرکت آشنا شدم، اعضای تیمم را ملاقات کردم و سیستمم را هم ست آپ کردم.

از روز دوم منتورشیپ من شروع شد. با توجه به اینکه هیچ تجربه‌ای به جز پروژه‌های سمپل نداشتم، آشنایی با کدبیس دیوار قدم اصلی بود. در این دوره منتورم راهنمای مشارکت در توسعه کدبیس دیوار را به من توضیح داد که شامل قوانینی بود که برای توسعه دادن و تمیز بودن کد باید رعایت شوند. مباحث آشنایی با فرمر (ساختار فرم‌ها)، سنت (دیزاین سیستم) و الک (ساختارهای داینامیک صفحه‌ها) و جیسون اسکیما و کاربرد آن‌ها را پیش بردیم. تسک‌هایی که در این دوره داشتم شامل مطالعه کد‌های بخش‌های مختلف، مسلط شدن به لایبرری‌هایی که در دیوار استفاده می‌شوند، ریفکتور کردن بخش‌هایی از کد و تست نوشتن برای کدها بود. انجام این تسک‌ها دید خوبی از پروژه به من داد. علاوه بر این‌ها در جلسات هفتگی چپتر شرکت می‌کردم تا با چالش‌هایی که بقیه توسعه‌دهنده‌ها با آن‌ها برخورد می‌کردند درگیر شوم.

این دوره حدود یک ماه و نیم طول کشید و منتورم در تسک‌هایی که باید انجام می‌دادم راهنمایی‌های مورد نیاز را در اختیارم می‌گذاشت و بعد از آن ریویوی کلی از مرج ریکوئست آن تسک و رفع مشکلات و بهبود کد انجام می‌شد.

در این دوره یاد گرفتم چطور باید کد بخوانم و یک مسیر از کد را دنبال کنم. این مهارت باعث شد بتوانم خیلی زود به ساختار پروژه مسلط شوم و در نهایت بتوانم روی آن ساختار کد بزنم. علاوه بر این با فرهنگ، ارزش‌ها رویه‌های انجام کارها در شرکت آشنا شدم. این شرایط هم همواره در دیوار برایم فراهم بود که آزادانه بتوانم سوالاتی را که در مورد مسائل فنی یا غیر فنی داشتم از افراد شرکت بپرسم و همیشه کسی پیدا‌ می‌شد که برای حل مشکلاتی که داشتم راهنماییم کند.

ادامه‌ٔ مسیر و قرار گرفتن در تیم

در ابتدای ورودم در چپتر اندروید دیوار منتورشیپم را شروع کردم. بعد از اتمام دوره منتورشیپ، در تیم‌های خودرو مشغول شدم. در دیوار افرادی که تخصص‌های مختلف دارند، تیم‌ها را تشکیل می‌دهند و افرادی که تخصص یکسان در تیم‌های مختلف دارند، چپتر‌ها را (مثلا چپتر اندروید). در هر چپتر موارد فنی‌ تخصصی‌تر و در تیم‌ها موارد محصولی‌تر جلو می‌روند.

در این دوره معمولا سوالاتم را از اعضای چپتر می‌پرسیدم و چپتر لیدرم به طور دقیق‌تر روند یادگیری و پیشرفت من در اندروید را پیگیری می‌کرد. انجام تسک‌های چالشی و مطالعه و یادگیری مداوم باعث شد که بتوانم تجارب زیادی در حوزه کاری‌ام کسب کنم و در مسیر تبدیل شدن به یک برنامه نویس خوب قرار بگیریم!

حل مسئله و انتخاب راه‌حل

یکی از مسائلی که در این دوره باید با آن آشنا می‌شدم روش حل مسائل بود. در دیوار برای تصمیمات فنی چالشی‌ صورت مسئله را مورد بررسی قرار می‌دهیم و سعی می‌کنیم برای آن‌ها چند راه‌حل پیشنهادی ارائه دهیم. برای مسائلی که پیچیدگی زیادی دارند دیزاین داک می‌نویسیم. به این شکل که برای هر راه‌حل خوبی‌ها و بدی‌ها و امکان پیاده‌سازی را بررسی کرده و در نهایت یکی از راه‌حل‌ها را انتخاب می‌کنیم و جزئیات تصمیمات‌مان را مستند می‌کنیم. بعد از آن این داکیومنت را در چپتر به بحث می‌گذاریم تا پیشنهادها و نظرات فنی سایر توسعه‌دهنده‌ها را روی راه‌حل‌مان اعمال کرده و در نهایت پیاده‌سازی کنیم. طی مراحل بررسی کردن بخش‌های مختلف کد، دیزاین ارائه شده توسط UX و protoی ریکوست و ریسپانس سرور را بررسی می‌کنیم تا بتوانیم بهتر تصمیم بگیریم.

این روش در تصمیم‌گیری‌های فنی به ما اجازه ‌می‌دهد در انتخاب روش خلاقیت داشته باشیم و بهترین راه‌ را انتخاب کنیم و در مورد تسکی که قرار است انجام دهیم آزادی عمل داشته باشیم و با بقیه اعضای تیم مشورت کنیم. در این روش داکیومنت‌های دیزاین فنی را ‌می‌خوانیم و یاد می‌گیریم چطور بهترین شکل پیاده‌سازی را ارائه دهیم. همچنین با مشارکت بقیه اعضای چپتر بخش‌هایی که در نظر گرفته نشده پوشش داده می‌شود.

آزادی عمل در مسیر محصول

یکی از مهم‌ترین ویژگی‌های کار در دیوار، خلاقیت در مسیر محصول است. در پایان هر دوره‌ی سه ماهه تمامی اعضای تیم دورهم جمع می‌شویم تا فعالیت‌های سه ماه گذشته را بررسی کرده و برای OKR سه ماه آينده برنامه ریزی کنیم. در این جلسه تمامی اعضا در یک طوفان فکری (brainstorm) شرکت می‌کنند و ایده‌هایی برای بهتر شدن محصول ارائه می‌دهند و از بین این ایده‌ها بهترین‌شان انتخاب شده تا در قالب ایتریشن‌ها در سه ماه بعدی انجام شوند. مشارکت در ارائه ایده‌هایی برای بهتر شدن محصول، باعث می‌شود که ما محصول را از خودمان بدانیم؛ همه ما در مسیر آينده‌ی آن نقش داریم و تمامی اعضای تیم برای رشد و بهبود محصول، ارزش خلق می‌کنند.

قبیلهٔ خودرو و تیم لیستینگ

قبیله خودرو از دو تیم تراکنش و لیستینگ تشکیل شده. تیم لیستینگ برای رشد سهم بازار دیوار در فروش خودرو تلاش می‌کند، تجربه‌ی کاربر در خرید ماشین در دیوار را بهبود دهد و معاملات موفق را بیشتر کند.

از جمله هدف‌های این تیم حضور فعال در فرآیند تحقیق و تصمیم‌گیری است که در این راستا فیچرهای مختلفی ارائه کردیم. صفحه قیمت صفر که شامل قیمت خودروهای صفر بازار است. این قیمت‌ها به طور روزانه به روز رسانی ‌می‌شوند. تخمین قیمت خودروی کارکرده، که پس از وارد کردن مشخصات آن، قیمت فعلی را با توجه به مدل‌های دیتایی تخمین می‌زند و همچنین صفحات مشخصات فنی که مرجع اطلاعات خودرو برای کاربران است. این تیم فیچر‌های مختلفی برای نمایشگاه‌های خودرو نیز ارائه می‌دهد. همچنین امکان نمایش اخطارهای مشکلات آگهی به صورت لحظه‌ای، کی از دیگر از فیچرهایی است که برای بهبود تجربه کاربر در فرآیند ثبت آگهی در دسته بندی‌ خوردو، ، در این تیم پیاده‌سازی شده است.

پیاده‌سازی سوکت در ثبت‌ آگهی دیوار

یکی از فیچرهایی که در تیم لیستینگ خودرو و راستای بهبود کیفیت آگهی‌های دیوار انجام شد، استفاده از سوکت در روند ثبت آگهی بود. برای رفع مشکلاتی که باعث رد آگهی در صف‌های بررسی آگهی می‌شود و نمایش اخطار real-time به کاربران، به سمت پیاده‌سازی این فیچر رفتیم. راه‌حلی که برای پیاده‌سازی این فیچر انتخاب شد، استفاده از سوکت بین سرور و اپلیکیشن اندورید بود. وظیفه‌ی این سوکت دریافت ایونت‌ (event)های تغییر فرم کاربر و سپس واکنش نشان دادن به این ایونت‌هاست. این سوکت در حال حاضر در ثبت آگهی در دسته‌بندی خودرو استفاده می‌شود.

این فیچر از لحاظ پیاده‌سازی فنی و همچنین انتخاب معماری چالش‌های فنی جذابی داشت و تجربه‌ی پیاده‌سازی آن و تاثیری که بر بهبود تجربه‌ی کاربر در این زمینه می‌گذارد یکی دیگر از جذابیت‌های این تسک است.

چالش

یکی از مواردی که در ساختار سوکت‌ها در اپلیکیشن اندروید مهم است، باز ماندن سوکت است. همیشه باید مطمئن شویم سوکت‌ها به درستی باز و بسته می‌شوند که اینکار با توجه به corner-caseهایی که در روند ثبت آگهی دیوار وجود دارند چالش‌های زیادی داشت. متفاوت بودن رفتار هر یک از سطرهای فرم در صفحه ثبت آگهی، وجود وابستگی بین سطرهای فرم و decouple بودن ساختار کدهای سوکت نسبت به کدهای ثبت آگهی چالش‌های دیگر این فیچر است.

چالش‌های باز و بسته شدن سوکت

سوکتی که در فلوی ثبت آگهی وجود دارد باید با تمامی تغییرات این فلو هماهنگ شود. این سوکت علاوه بر lifecycleهای fragmentهای ثبت‌آگهی، به موارد دیگری مثل تغییر دسته‌بندی، ورود اپلیکیشن به foreground و background و همچنین ایونت‌های باز یا بسته شدن سوکت که از سمت سرور اعلام می‌شوند باید واکنش نشان بدهد. در کنار این موارد سرور پس از سپری شدن زمان میانگین ثبت‌آگهی سوکت را می‌بندد تا مطمئن شویم هیچ سوکتی باز نمانده باشد.

در این قسمت نیاز بود تا سناریوهای مختلفی که نیاز بود سوکت در آن‌ها باز و بسته شوند را در نظر بگیریم:

  • ورود اپلیکیشن به foreground و background.
  • ورود و خروج از فرآیند سابمیت.
  • تغییر دسته بندی: با توجه به اینکه ساختار وارنینگ باید از سمت سرور قابل کنترل باشد و بنابراین روی دسته‌بندی‌های خاص و روی فیلدهای خاصی روشن باشد.
  • تغییرات اینترنت باعث بسته شدن سوکت و تلاش برای دوباره باز کردن آن می‌شود. زمان این تلاش به شکل نمایی افزایش می‌یابد.
  • بستن سوکت وقتی سوکت برای دقایق مشخصی idle باشد. بعد از تمامی مواردی که برای باز نماندن سوکت باید رعایت می‌کردیم این اقدام را در نهایت انجام دادیم که سوکت به شکل server-side بسته شود تا مطمئن باشیم هیچ مشکلی به وجود نمی‌آید.

جمع بندی سوکت

این تسک فرصت خوبی برای من بود تا بتوانم یک تسک چالشی و پیچیده که corner-case های زیادی داشت را به زیرتسک‌های کوچک‌تر تقسیم کنم و برای پیاده‌سازی و نحوه دیزاین فنی هر یک از بخش‌ها تصمیم بگیرم و راه‌حل‌های متعدد را امتحان کنم. در این تسک در هر مرحله با چالش‌های جدیدی رو به رو شدم و برای آ‌ن‌ها با مشورت اعضای چپتر توانستیم راه‌حل‌هایی پیدا کنیم و این چالش‌ها را برطرف کنیم. همچنین با وجود اینکه ساختار سوکت را پیش‌تر از این در چت دیوار داشتیم، خودمان را محدود به استفاده از کتابخانه‌های legacy نکردیم و با آزادی تمامی کتابخانه‌های موجود برای سوکت را بررسی کردیم و در نهایت بهترین آن را انتخاب کردیم.

تجربه‌ٔ من در دیوار

به عنوان کسی که قبل از ورود به دیوار هیچ تجربه‌ی کاری‌ای نداشتم و بجز پروژه‌های sample و تمریناتم تجربه‌ی فنی دیگری نداشتم، امروز می‌توانم یک تسک پیچیده و چالشی را به کمک اعضای تیم و با مشورت انجام دهم و در بهبود محصول تاثیرگذار باشم. کارآموزی و سپس استخدام شدن در دیوار تجربه‌ی خوبی بود که مسیر شغلی من را به سمت خوبی هدایت کرد.

تمامی روندهای کارآموزی، منتورشیپ و کارکردن در ساختار تیم‌های دیوار باعث شد تا بتوانم در کنار همکارانم کار تیمی اثربخش را تجربه کنم، مسائل جذاب را حل کنم، برای چالش‌هایی که در راه به آنها برمی‌خوردم راه‌حل پیدا کنم و در فرآیندهای توسعه یک نرم‌افزار خوب دخیل باشم و ایجاد ارزش کنم.

با وجود تمام تجربه‌هایی که در این مدت کسب کردم و تمام چیزهایی که یاد گرفتم، مطمئنم که هنوز چیزهایی زیادی برای یاد گرفتن وجود دارد. اما خوشحالم که در کنار افراد حرفه‌ای و باتجربه‌ای کار می‌کنم که نقش مهمی در رشد و پیشرفت من داشته‌اند و هنوز می‌توانم در کنار آنها چالش‌های جذابی را تجربه کرده و دانش و مهارتم را بهبود بدهم.

فضای کسب تجربه بدون داشتن سابقه و کار کردن در یکی از بزرگ‌ترین و به‌روزترین شرکت‌های ایران، برای من تجربه بی‌نظیری بود و خوشحالم که آن روز در دانشگاه، با اطلاعیه آن دوره آموزشی مواجه شدم!