عند العمل على مشروع data science، قد تُطلب مهارات عديدة، من النظرية إلى technical.
في هذا المقال، سأركّز بشكل أساسي على بعض important tools التي يجب امتلاكها والعمل بها، أدوات تتيح برمجة أفضل وcleaner coding وطريقة faster في collaboration.
الملخّص كالتالي:
- Visual Studio Code
- أوامر Bash
- Virtual environment
- Unit Testing
Visual Studio Code
المهامّ اليومية لـ Data Scientist تدور بشكل رئيسي حول البرمجة. ولهذا من المهمّ امتلاك محرّر جيد قادر على تغليف العديد من الأدوات الأخرى. وVS Code يفعل ذلك! إنّه أداة طوّرتها Microsoft وتُعتبر من أكثر المحرّرات استخداماً. وهو يتيح تشغيل وتحرير و debug كودك، إلى جانب العديد من الإضافات المفيدة الأخرى مثل:
- Python: "A Visual Studio Code extension with rich support for the Python language, including features such as IntelliSense, linting, debugging, code navigation, code formatting, Jupyter notebook support, refactoring, variable explorer, test explorer, snippets, and more!"

- Gitlens : "GitLens supercharges the Git capabilities built into Visual Studio Code. It helps you to visualize code authorship at a glance via Git blame annotations and code lens, seamlessly navigate and explore Git repositories, gain valuable insights via powerful comparison commands, and so much more."

- Git Graph: يتيح تصوّر الرسم البياني لفروع git الخاصة بك وتنفيذ إجراءات git باستخدام الرسم البياني ذاته!

- Vscode-icons: يجلب الأيقونات إلى Visual Studio Code لتمثيل وتصوّر أفضل

- Docker: "The Docker extension makes it easy to build, manage, and deploy containerized applications from Visual Studio Code. It also provides one-click debugging of Node.js, Python, and .NET Core inside a container." إذا لم تكن مألوفاً مع docker، فلا تقلق بشأن هذا الجزء.

- Black: مكتبة تنسيق لـ Python تكون مثبَّتة افتراضياً (إن لم تكن كذلك استخدم pip) وتتيح تنسيق كودك تلقائياً عند الحفظ. للقيام بذلك، يمكنك إضافة الأسطر التالية إلى ملفّ "setting.json" في VS Code
"python.formatting.provider": "black",
"editor.formatOnSave": trueفيما يلي مثال على تنسيق Black للكود:

- Better comments: عند كتابة الكود، تضيف عادةً تعليقات لتفصيل نصوصك البرمجية وشرحها. تساعدك هذه الإضافة على جعلها أكثر ودّية وأكثر قابلية للفهم. يمكنك مثلاً استخدام إشارة "!" لجعل التعليقات حمراء ومن ثمّ لفت انتباهك إليها بشكل أفضل.
فيما يلي مثال على التظليل الذي تولّده الإضافة:

لمزيد من المعلومات، يُرجى زيارة الموقع الرسمي لـ VS Code.
أوامر Bash
أوامر Bash مفيدة جداً للتنقّل بسرعة داخل نظام التشغيل، وهي فعّالة في التعامل مع الملفّات. كما تظهر أهمّيتها عند العمل على آلة افتراضية بدون واجهة رسومية، بيئة سحابية مثلاً.
عند العمل بأوامر bash، من المهمّ امتلاك terminal جيد قادر على تغليف العديد من العناصر بصرياً. وفيما يلي وحدتا تحكّم أوصي بهما:
- Mac: Iterm 2، يوفّر terminal بصرياً جميلاً يمكنك العثور فيه على معلومات حول directory العمل الحالي وgit وفروعه (project dev) وحالته (أصفر: في انتظار commit) وكذلك virtual environment الذي تعمل عليه (project_env).

- Windows: Cmder، هو terminal محسَّن أكثر يتيح أيضاً تشغيل أوامر linux التي تكون مفيدة جداً في بعض الحالات.

ولا تتردّد أيضاً في الاطّلاع على Powerlevel10K، فهي ميزة رائعة لـ terminal تتيح أسلوباً أفضل وطريقة عمل أكثر فعّالية ومرونة.
فيما يلي قائمة موجزة بأكثر أسطر الأوامر استخداماً (على macOS):

بعد تثبيت الـ terminal، يمكن العمل به ضمن VS Code، مما يجعل عملك أكثر فعّالية.
Virtual environment
عند العمل على مشروع، فإنّك غالباً ما تريد أن يكون قابلاً للتكرار على آلات أخرى وفي السحابة. ولأنّ إصدارات الـ packages المستخدمة تتغيّر باستمرار، فمن المهمّ ضبط بيئة خاصة أو virtual يمكنك تطوير مشروعك فيها وحفظ إصدارات الـ packages. virtualenv هي مكتبة Python تتيح لك تنفيذ العزل وإدارة الإصدارات المذكورين أعلاه كما يلي (يمكنك أيضاً استخدام anaconda):

عند تثبيت Python لأوّل مرّة على حاسوبك، تكون بيئته الافتراضية باسم "base" أو "global". وتجدر الإشارة إلى أنّ الـ virtual environments المُنشأة لا تتواصل مع base، أي أنّها فارغة في البداية!
إنشاء وتفعيل virtual environment
#PIP
cd dossier project
pip install virtualenv # if not done before
virtualenv <env>
source <env>/bin/activate
#Anaconda
cd dossier project
conda create -n <env>
conda activate <env>قم بتثبيت الـ packages pip install <packageName>/ conda install <packageName> تدريجياً عند الحاجة، وعندما يستقرّ مشروعك:
#PIP
pip freeze > packages.txt/
#Anacondaconda env export > packages.ymlإذا قمتَ باستنساخ مشروع يحتوي على ملفّ "packages.txt" أو "environment.yml" لتشغيله، يمكنك:
- أوّلاً إنشاء وتفعيل virtual environment جديد
- تشغيل الأمر التالي لتثبيت جميع الـ packages اللازمة فيه من الملفّ المُعطى:
#PIP
pip install -r packages.txt/
#Anaconda
conda env create -f environment.yml #No need to create an env beforeVS Code والـ virtual environments
عند إنشاء virtual environment، من المهمّ اختياره كـ interpreter. وVS Code قادر على اكتشافه وسيقترحه للاستخدام، وإلا يمكنك اختياره كما يلي:
- في الإعدادات، انقر على
Command Palette - اكتب:
Python: Select Interpreter - اختره من القائمة:

أُفضّل شخصياً العمل مع Virtualenv وpip بدلاً من Conda لأنّ Virtualenv يتيح تثبيت الـ packages الضرورية فقط ويُحسّن استخدام الذاكرة.
يُرجى زيارة موقع virtualenv لمزيد من المعلومات.
Unit Testing
Unit testing هي تقنية اختبار برمجي تُشغّل سلسلة من الاختبارات الفردية التي تتحقّق من حسن عمل module مطوَّر أو جزء منه. وتظهر أهمّية هذه الاختبارات خصوصاً عند تبنّي مقاربة test-driven development في مشروعك. وتقوم على كتابة الاختبارات التي يجب أن يجتازها نصّك البرمجي أوّلاً قبل البدء بتطويره.
في Python، يمكنك استخدام unit testing عبر إطار العمل pytest الذي يناسب جداً المشاريع الصغيرة والكبيرة. لنفترض أنّنا نطوّر دالة f ينبغي لها أن تُرجع expected_value لكلّ مجموعة قيم (var1،var2،...).
بعد كتابة الاختبارات التي يجب أن تجتاز، نطوّر الدالة ثم نكتب نصّاً بالمخطّط التالي:
#Import packages
import pytest
import ...
#Create function
def f(var1, var2,...):
return ...
#Unit tests
@pytest.mark.parametrize(
"var1, var2,...,expected_result",
[
(val1_1, val2_1,...,expected_result_1),
(val1_2, val2_2,...,expected_result_2),
...
]
)
def test_func(var1, var2,..., expected_result):
assert f(var1,var2,...)==expected_resultسيختبر النصّ أعلاه جميع الاختبارات المختلفة (var1_i،var2_i،…) ويتحقّق ممّا إذا كانت تطابق قيمها المقابلة expected_value_i واحدة تلو الأخرى عبر تشغيل سطر الأوامر التالي:
- مثال: دالة الرفع إلى قوّة.
من باب التوضيح، سنعتبر دالة بسيطة: قوّة عدد. ملفّ الـ unit testing هو التالي:
#Import packages
import pytest
import ...
#Create function
def f(var1, var2,...):
return ...
#Unit tests
@pytest.mark.parametrize(
"var1, var2,...,expected_result",
[
(val1_1, val2_1,...,expected_result_1),
(val1_2, val2_2,...,expected_result_2),
...
]
)
def test_func(var1, var2,..., expected_result):
assert f(var1,var2,...)==expected_resultنُشغّل سطر الأوامر التالي:
python -m pytest -v --tb=line --disable-warnings pathtotestfile.py::functionنحصل على النتائج التالية:

اجتازت الاختبارات الثلاثة. وكلّما زادت الاختبارات لدينا، أصبح الكود أكثر استقراراً!
الخاتمة
بصفتك Data Scientist، من المهمّ جداً إتقان هذه التقنيات من أجل جعل عملك أكثر فعّالية وقابلية للتوسعة. أدوات مثل git لا غنى عنها وتجعل التعاون قوياً ومباشراً.
أُشير كذلك إلى أنّ بعض هذه الأدوات هو خيار شخصي ويمكن استبداله بأدوات أخرى قادرة على أداء العمل أيضاً!
#TEAMVSCODE #TEAMITERM2
