<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Ali Mahmoodi</title>
        <link>https://virgool.io/feed/@ali.mahmoodi.heris</link>
        <description>تولید محتوای برنامه نویسی در یوتوب و همزمان ترکیه سرپرست تیم توسعه هستم</description>
        <language>fa</language>
        <pubDate>2026-07-14 20:06:50</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/137445/avatar/SeZI1C.jpeg?height=120&amp;width=120</url>
            <title>Ali Mahmoodi</title>
            <link>https://virgool.io/@ali.mahmoodi.heris</link>
        </image>

                    <item>
                <title>Adaptive Neural Networks</title>
                <link>https://virgool.io/@ali.mahmoodi.heris/adaptive-neural-networks-uhis7uxs8tr6</link>
                <description>Title:A Proposal on Graph-Based Connectivity, Mini Memory, and Selective Adaptation Mechanisms in Nature-Inspired Dynamic Adaptive Neural NetworksAbstract:Conventional deep learning models employ fixed and dense connections, requiring all neurons to be active at every computation step. However, the principle of natural selection observed in nature — survival of the strong, elimination of the weak — and the idea that individual neurons in biological neural systems possess local memory offer the potential for developing more efficient, dynamic, and adaptive architectures in artificial neural networks. This paper proposes a neural network architecture where each neuron establishes graph-based connections with a limited number of neighbors; stores past parameters in a mini-memory to exhibit multiple behaviors depending on the input; and during training, only successful paths are activated and rewarded, while weaker paths are revised through a feedback mechanism and pruned if necessary. This structure parallels nature’s “preserve the strong, eliminate the weak” principle, aiming for the model to form its own optimal architecture through an evolutionary process.1. IntroductionTraditional neural networks operate with fixed layers and dense connectivity, causing every neuron to be active in each computation step. This leads to high computational costs and memory usage. Observations from nature suggest an evolutionary selection principle — the survival of the strong and elimination of the weak — which aligns with reinforcing only successful paths and connections during training. Furthermore, the concept of each neuron in the brain possessing its own local memory, rather than relying on a single central memory, provides new approaches to enhance the flexibility of neural networks. This paper proposes a neural network architecture based on these principles, which can dynamically adapt during training and is supported by trackable, reward-based feedback mechanisms.2. Related WorkIn the literature, aside from fixed dense networks, researchers have explored sparse connections, mixture-of-experts (MoE), dynamic neural network architectures, Graph Neural Networks (GNNs), and neuroevolution methods. Although these approaches aim to improve model efficiency and adaptation capabilities, our proposed architecture uniquely combines the following features:Each neuron utilizing its own mini-memory to exhibit multiple behaviors specific to various inputs.In line with the principle of natural selection, successful paths are rewarded, and weaker paths are pruned.The implementation of trackability and feedback mechanisms during training to correct incorrect orientations.3. Proposed Architecture3.1 Graph-Based ConnectivityModular and Limited Connections: Instead of the traditional layer-based structure, the network is modeled as a graph. Each neuron is connected to a predefined maximum number of neighbors (e.g., 5 or 10). Neurons communicate by sending only “wake-up” signals to their neighbors rather than directly sharing information. This approach enables each neuron to perform its own computations and decision-making, activating only when necessary.Dynamic Path Formation: Starting from the input neuron, connections in the graph are triggered sequentially. Although potentially millions of paths can be generated during training, only input-specific, rewarded, and trackable paths are activated.* 3.2 Mini-Memory and Multiple BehaviorsLocal Memory: Each neuron stores the most recent few (e.g., 5) versions of its parameters in a mini-memory. These versions carry a “strength score,” calculated based on factors such as usage frequency, performance, and rewards. This allows the neuron to select the most suitable behavior based on previous successful connection configurations.Multiple Behavior Capability: A neuron can activate different connection paths for various conditions. Thus, rather than displaying a single fixed behavior, the same neuron can generate diverse paths depending on input diversity. At certain intervals, each neuron compares the versions in its mini-memory and either eliminates or updates those with low “strength scores.” This process can be viewed as a dynamic tournament within each neuron’s mini-memory.* 3.3 Feedback and Reward MechanismsPerformance Monitoring and Feedback: During training, the loss and other performance metrics of each path are monitored. If a path’s results fall below a specified threshold, the system re-evaluates that same path via a feedback mechanism rather than re-updating the entire path from scratch. This identifies and corrects misguided orientations; however, if consistently low performance is observed on the same path, appropriate updates are made to prune that path.Reward-Based Adaptation: Successful paths and connections receive rewards. The reward reinforces the successful parameters stored in the neurons’ mini-memory, ensuring they are more likely to be chosen in the future. Moreover, the reward mechanism can trigger the addition of new neurons or connections, which not only strengthens successful paths but also contributes to the network’s expansion and growth.Structural Expansion: Beginning with neurons that receive the highest rewards, if the maximum number of neighbors for a neuron is exceeded, the process shifts to a lower layer, where new strong connection paths are sought. When neurons receive rewards, perform backpropagation, reach their connection capacity, or add new connections, they trigger a tournament among the versions in their mini-memory.* 3.4 Selective Activation and Computational EfficiencySelective Activation: During both training and inference, not all neurons are activated simultaneously; only the neurons in the rewarded and selected path participate in the computation. This significantly reduces overall computational and memory costs.Efficient Computation: Because processing occurs only through specific and rewarded paths, billions of neurons — as in conventional dense models — do not need to be activated. This approach increases computational speed and optimizes resource usage. Pruning unnecessary connections and applying selective activation significantly boost the network’s efficiency in both computation and memory.4. Philosophical Foundations and DiscussionThe proposed structure is grounded in the principle of natural selection: the survival of the strong and the elimination of the weak. During training, successful connection paths are reinforced and rewarded, while low-performance paths are pruned or corrected via the feedback mechanism. This evolutionary process allows the model to form its own optimal architecture based on principles of “fairness”. Each neuron’s local memory highlights a decentralized form of information processing; thus, every component of the network can produce the most appropriate response to an input, relying on past experiences. In this architecture, “strength” is defined as a combination of factors such as neurons’ interactions, mini-memory usage, behavioral diversity, and adaptability to requirements. Each neuron evolves toward an optimal structure through its internal and environmental interactions.Advantages:Computational and Memory Efficiency: Through selective activation and pruning of unnecessary connections, the overall computational load is significantly reduced.Adaptive and Evolutionary Learning: Feedback and reward mechanisms enable the model to dynamically optimize itself. Strong connections are reinforced while weak paths are pruned, mirroring the principles of natural selection.Flexible Architecture Formation: Throughout the training process, the model evolves continuously; successful paths multiply, new connections are added, and the structure is rearranged as needed.Challenges:Management and Coordination: Managing each neuron’s mini-memory, dynamic connection structures, and tournament mechanisms introduces additional computational and memory complexity. Optimal management of this complexity will require careful engineering and experimental research.Feedback and Update Criteria: Determining under which conditions feedback is initiated, the reward thresholds, pruning strategies, and the tournament frequency all need to be optimally defined.Traceability and Practical Implementation: Monitoring paths during training, integrating error path detection algorithms, and ensuring the seamless operation of new connection mechanisms all require detailed investigation in practical scenarios.5. ConclusionThe proposed dynamic adaptive neural network architecture offers a more efficient and adaptive learning process compared to conventional dense networks. This approach is inspired by evolutionary principles from nature, leveraging each neuron’s local memory to respond flexibly to inputs. During training, only rewarded paths are actively computed. Misguided orientations are corrected through the feedback mechanism, and underperforming paths are pruned, thereby allowing the network to dynamically form its own optimal architecture. The reward mechanism triggers opportunities to add new neurons or connections, facilitating the model’s evolutionary growth. This approach provides significant improvements in computational and memory costs, while also showing promise for the development of adaptive learning processes and evolutionary structural optimization. In the future, experimentally validating this architecture and integrating it into various application domains will be an exciting research topic for the deep learning community.AcknowledgementsThe authors would like to thank Mohammad Jamali Marand for his valuable contributions, feedback, and inspiring discussions throughout this study. His insights were instrumental in the development of the ideas and concepts presented in this paper.Keywords:Dynamic neural network, graph-based connectivity, mini-memory, feedback mechanism, selective activation, adaptive path selection, evolutionary learning, natural selection</description>
                <category>Ali Mahmoodi</category>
                <author>Ali Mahmoodi</author>
                <pubDate>Mon, 24 Mar 2025 23:11:25 +0330</pubDate>
            </item>
                    <item>
                <title>The Software World and Artificial Intelligence</title>
                <link>https://virgool.io/@ali.mahmoodi.heris/the-software-world-and-artificial-intelligence-nqlgtvkdd0gv</link>
                <description> Revolution or Evolution? A New Paradigm Beyond BoundariesArtificial Intelligence (AI) is rising as a powerful technological wave transforming software development processes. Particularly, Large Language Models (LLMs) are creating new opportunities across a spectrum from simple applications to complex workflows. Tools based on the “agent” concept, such as Langchain, Semantic Kernel, and N8N, strive to materialize this potential. However, the inherent limitations of LLMs and challenges encountered in large-scale projects necessitate a cautious approach. This article examines the current state of AI-assisted software development, the pros and cons of LLMs, and introduces Small Language Models (SLMs) as an emerging solution.1. The Rise of LLMs: Expectations vs. RealitiesSolutions provided by startups like Cursor AI IDE and Anthropic symbolize AI’s transformative impact on software development. However, closer analysis reveals:Effectiveness in Small Applications: While successful in smaller projects, LLMs struggle to maintain context in complex scenarios.Context Loss and Repetitive Errors: As projects grow, LLMs frequently lose context, repeat similar mistakes, and require constant reprompting.These limitations indicate LLMs alone aren’t sufficient for comprehensive software development needs.2. Langchain, Semantic Kernel, and MCPTools such as Langchain and Semantic Kernel have been designed to deliver more consistent and context-aware results from LLMs. Nonetheless:Inconsistency: Receiving varied responses to identical prompts threatens application stability.Complex Prompt Management: Mechanisms like function calls and auto-invoke can complicate processes.Model-Context-Protocol (MCP) attempts to address these issues, but core limitations persist, primarily due to the lack of memory and learning capabilities in LLMs, creating sustainability issues.3. Memory Issue in LLMs: “Forgetfulness”The lack of memory in LLMs restricts their ability to achieve persistent learning:Continuous Re-training: Models require repetitive prompting.Instability and Versioning Issues: New model versions can become incompatible with older prompts.4. Inefficient Use of Large Models: Using a Truck to Carry PassengersLarge Language Models, encompassing vast knowledge bases, suffer from unnecessary data overload:High Cost and Low Efficiency: Excessively costly and inefficient for simple tasks.Privacy Risks: Large, unnecessary datasets can pose security threats.5. Small Language Models (SLMs): Focused and Efficient SolutionsSLMs are lightweight, specifically-trained models focused on particular purposes:Single SLM Approach: The model is trained exclusively with functional data like function calls and orchestration.Function Definition and Orchestration: Instead of separate models per application, a single SLM can easily incorporate or remove functionalities.This method reduces costs, enhances performance, and streamlines software processes.6. New Software Architecture: Function Calls and OrchestrationIn this novel architecture:Function Definition and SLM Integration: Simple functions introduced to SLM can be swiftly managed.Protocol Independence: Supports various communication protocols (HTTP, TCP, WebSocket).Alignment with Agile: Easily adding or removing functions makes software processes quicker and more sustainable.7. Transforming the Developer’s Role: Strategic and Architectural FocusDevelopers now focus more on strategic planning and architectural design rather than coding:Reduced Complexity: Eliminates the need for complex architectures, focusing on simple functions.Increased Creativity and Strategy: As AI handles routine tasks, developers can focus on innovation and optimization.8. Persistent Memory and Learning ChallengesBoth LLMs and SLMs still lack genuine learning capabilities:Error Repetition: Models fail to learn from past mistakes, needing continuous human intervention.Limited Error Variability: Narrow-scope SLMs produce fewer errors, but their learning mechanisms remain constrained by manual interventions.Long-term, persistent learning capabilities promise significant improvements.9. Conclusion: Right Technology, Right ApplicationAI-supported software development represents a rational evolutionary rather than revolutionary process. Instead of approaching every challenge with large models, purpose-designed smaller models (SLMs) can provide sustainable and efficient solutions. This approach reduces costs, enhances performance, and simplifies software development processes. Developers’ roles evolve strategically and architecturally, setting the stage for a new paradigm.This rational AI-driven approach provides a robust and sustainable foundation for the future of software development.</description>
                <category>Ali Mahmoodi</category>
                <author>Ali Mahmoodi</author>
                <pubDate>Mon, 24 Mar 2025 23:00:00 +0330</pubDate>
            </item>
                    <item>
                <title>کپسوله‌سازی با مدل متاهل در مهندسی نرم افزار.</title>
                <link>https://virgool.io/Rocket/%DA%A9%D9%BE%D8%B3%D9%88%D9%84%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%A8%D8%A7-%D9%85%D8%AF%D9%84-%D9%85%D8%AA%D8%A7%D9%87%D9%84-%D8%AF%D8%B1-%D9%85%D9%87%D9%86%D8%AF%D8%B3%DB%8C-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-jzczeosu0r2c</link>
                <description>تصویر شماره یکامروز تصمیم گرفتم بخش دیگری از نوشته‌هایم را در پیرامون فلسفه در مهندسی نرم‌افزار رو با شما به اشتراک بگذارم.از نظر من یکی از بزرگترین مشکلات زبان‌های برنامه نویسی چه در برنامه نویسی فانکشنال چه در شی‌گرا، نبود کپسوله‌سازی قابل قبول هست.نرم‌افزار ذاتا قابل تغییر هست و بیشتر مشکلات از تغییر به وجود می‌آید.از همان روزهایی که شی‌گرا و فانشکنال طراحی شدند، هر کدام در تلاش بودند تغییر در نرم‌افزار را به صورت امن انجام بدهند تا باگ‌های ناگهانی رخ ندهد، این شد سطوح دسترسی مثل پابلیک یا پرایوت رو طراحی کردند.مدتی زیادی هست در حال نوشتن یکسری راه‌حل در جهت بهبود این موضوع هستم.Married Acess Modifireدر دنیای واقعی چه در اشیا و چه در جانداران ما بحث تاهل رو داریم، در این نوشته در مورد وراثت در مدل تاهل رو نمیخام به دست بگیرم و  درآینده در مورد اونم صحبت خواهم کرد.اگر یه انسان متاهل رو در نظر بگیرد او دیگر نمیتواند در اختیار دیگران باشد، مقاله عضو بودن یه شخص به یک کمپانی رو هم تاهل میداند، وقتی کارمندی استخدام شرکتی می‌شود دیگر اجازه فعالیت در دیگر شرکت‌هارو ندارد، ماشین خریداری شده در اختیار یک شخص هست و... تاهل رابطه خیلی نزدیکی با افزایش امنیت و کیفیت دارد.همانطور که یکی از اساسی‌ترین مفاهیم در دنیای واقعی متاهل بودن هست، میتوان از این کانسپت در دنیای توسعه الگو گرفت و یکسری کامپوننت یا فانکشن یا فیلد‌هارو به صورت متاهل تعریف کرد تا همیشه در اختیار یک وظیفه باشد. در دنیای صنعت هم اگر دقت کنیم، یک کلید همسر یک قفل هست، گاها برای جلوگیری از استفاده اشتباه کاربران، طوری طراحی می‌کنیم که امکان جاگیری غلط ممکن نباشد، حتی مصرف کننده بخواهد اشتباه وصل بکند، این اتفاق رخ نده مانند طراحی پریز‌ها یا سوکت‌ها.به نظر شما اگر یک فانکشن، کامپوننت، کلاس یا متغییر متاهل باشد و در طول حیات توسعه تنها بتواند یک همسر اختیار کند چه آورده‌هایی میتواند داشته باشد؟ یعنی وقتی برای اولین بار از سمت کسی استفاده شد برای دیگران امکان استفاده شدنش ممکن نباشد و کامپایلر اجازه استفاده به دیگر اجزارو رو ندهد؟به نظر میاد روند کپسوله‌سازی و تغییر ناپذیری رو بتونه اصلاح بکنه و در راستای این، افزایش کوهیژن و کاهش وابستگی رو خواهیم داشت.دیگر مثل قبل هر کسی نمیتونه فانکشن، کامپوننت‌ یا متغیر‌های متاهل رو دستکاری بکنه و اینم باعث میشه به سمت مرکزی شدن حرکت کنم.فکر کنید من یه کامپوننت کنترل استثنا نوشتم و سطح دسترسی رو از نوع متاهل انتخاب کردم، اینجا در کل سیستم امکان استفاده از چنین مکانیزمی رو فقط و تنها فقط برای یه کامپوننت، فانکشن یا متغییر رو میده، دیگر مثل سابق برنامه نویس نمیتونه همه جا ازش استفاده بکنه و مجبور هست طراحی رو طوری انجام بده که جاهایی که نیاز داره رو از اون کلوگاه رد کنه، چیزی که در برنامه نویسی آسپکت‌گرا و کراس کاتینک کونسورن  دنبالشیم.فکر کنید نیازمند کار با دیتابیس هستم و میام  اونو متاهل انتخاب می‌کنیم، دیگه نیازی به استفاده از آنتی پترن سینگلتون نخواهد بود.نیازمند یه متغیر هستم برای کنترل یه وضعیتی و میخام اون متغییر تنها از سمت یه فانکشن قابل تغییر باشه، در عین حال سراسری هم باشه، اینجا میتونیم اون متغیر رو متاهل تعریف کنیم و خیالمون راحت هست، چون در طول حیاتش کسی نمیتونه تغییرش بده،در صورت نیاز از فانکشنی که اونو استفاده میکنه درخواست تغییر باید بدهند. در حالت عادی با پرایوت کردن سطح دسترسی برای بیرون،  این کار ممکن هست ولی در این مدل آورده‌های دیگری رو هم خواهیم داشت.یه نیم نگاهی که میکنیم میبینم کلی آورده دارد، اگر زبان‌های برنامه نویسی چنین امکانی بدهند، میتونه توی توسعه نرم‌افزار کمک بزرگی به ما بکنه، همچنین توی طراحی معماری میتونه خیلی کمک کننده باشه و طراحی‌هارو خیلی  قابل درک‌تر و توسعه پذیرتر بکنه.سطح دسترسی متاهل میتونه مفهوم تک وظیفگی رو به صورت کامل ارضا کنه و مارو نزدیک بکنه به کپسوله سازی صد‌درصد، اگر مشکل تک وظیفه‌گی حل بشه کیفیت کد به صورت چشمگیری بالا خواهد رفت.امنیت کد بالا خواهد بود چون تغییرات از یکجا انجام می‌شود.دیباگ کردن راحت خواهد بود چون همه چیز به سمت مرکزی شدن حرکت میکند.توسعه راحتر خواهد بود چون امکان دستکاری کامپوننت‌های اصلی و تغییرش از طرف دیگران ممکن نخواهد بود.نیازی به آنتی‌پترن سینگلتون نخواهد بود.شاهد افزایش پرفورمنس خواهیم بود، چرا که مسیر حرکت دیتا معلوم بوده و یک فلو دارد.خواه ناخواه سیستم به سمت طراحی دیفنسیو حرکت خواهد کرد.به دلیل اجبار در مرکزی شدن اجزای اصلی، حجم کد کاهش پیدا میکنه و از تکرار کد جلوگیری میکنه.بحث غیر‌قابل تغییر بودن در فانکشنال پروگرمینگ رو به صورت جدی بهبود خواهد داد.بحث کپسوله سازی در شیگرا رو به صورت جدی بهبود خواهد.از استفاده نادرست توسط توسعه دهنده جلوگیری کرده و باعث کاهش باگ می‌شود، اینم باعث افزایش کیفیت سیستم شده و توسعه پذیری رو بالا می‌بره.توسعه سیستم‌های مالتی‌ترد راحتر خواهد بود چون اشتراک منابع تحت کنترل و مرکزی هست.DataAccessObject کلاس DataAccessObject تنها یک فانکشن پابلیک دارد IsConnect و اینو میتونید از هر جایی صدا بزنید استفاده کنید.QueryReposotory فانکشن GetByQuery رو کلاس QueryReposotory استفاده کرده و غیر اون دیگه کسی نمیتونه استفاده بکنه.CommandReposotory  متد Add -Update-Remove رو هم  کلاس CommandReposotory استفاد میکنه و کس دیگری نمیتونه استفاده بکنه.GenericRepositoryکلاس GenericRepository خواسته دوباره از فانکشن ها استفاده بکنه ولی اجازه نداده و گفته فانکشن ها در دسترس نیستن و  فقط به IsConnect اجازه داده که استفاده بکنه.mainدر متد main هم اگر دقت کنید به همشون اجازه دسترسی نمیده و کپسوله سازی رو تونسته خیلی راحت ارضا بکنه و از اشتباه دولوپر جلو گیری بکنه و یه کد امن و مرکزی رو بهمون میسر بکنه. حالا دولوپر های دیگه هم بخان با دیتابیس کار بکنن حتی اگرم بخان نمیتونن از آبجکت DataAccessObject استفاده بکنن.حق کپی‌رایت این مقاله و مدل متاهل متعلق به علی محمودی هست و هر‌گونه استفاده از تصاویر،متن،مقاله،ایده بدون اجازه ناشر غیر قانونی می‌باشد.</description>
                <category>Ali Mahmoodi</category>
                <author>Ali Mahmoodi</author>
                <pubDate>Sat, 03 Sep 2022 22:19:45 +0430</pubDate>
            </item>
                    <item>
                <title>منم یه جونیور بودم</title>
                <link>https://virgool.io/@ali.mahmoodi.heris/%D9%85%D9%86%D9%85-%DB%8C%D9%87-%D8%AC%D9%88%D9%86%DB%8C%D9%88%D8%B1-%D8%A8%D9%88%D8%AF%D9%85-rmnculjc4nvb</link>
                <description>سختی در پی خود سختی بیشتری رو می آورد!!پشت هیچ سختی آسانی وجود ندارد! اما حداقل تکلیفت با سختی مشخص هست! میدونی چجوری باهاشون برخورد کنی، برخورد کردن با جنگيدن متفاوت هست. جنگيدن با سرنوشت یک اشتباه هست، بزرگترین هنر آدمی درک و قبول کردن تفاوت هاس، بعد از قبول کردن میتونی مشکلات رو بشناسی وقتی به شناخت برسی دیگه سختی ها و دردها معنیش عوض میشه به کار گاها تفریح، گاها سرگرمي،گاها پیشرفت جامعه بشری!!  بدون قبول کردن و درک کردنش..شروع به اعتراض، جنگ، غر زدن بکنی از دم باختی و قرار هست بیشتر و بیشتر عذاب بکشی و هر روز بدتر و بدتر بشه!زندگی کردن هنریست همراه درد که دردش معجزه ایست از جنس حرکت.مشکلات برای ساختن و آرامش ما می آیند، فرصتی هستد برای ساختن و شناخت چرایی خودت و جهانت، نوری هست به پهنای اندیشه های باز، اگر قبولش کنی و درکش کنی با درد همدردی کنی اون جا نطقه ای هست که متولد میشی و شروع میکنی به زندگی. متاسفانه ما از در وارد نشده شروع میکینم به قبول نکردن، جنگ کردن باهاش!! ما شانسی دربرابر مشکلات نداریم، اگر پدران ما مشکل سرما رو قبول و درک نمیکردن، نمی‌شناختنش، الان هیچ خونه ای بنا نمیشد و آتش معنی نداشت اما با قبول درد و مشکلات و شناختش، بهمون زندگی کردن رو هدیه کردن.فکر کنم 7 سالم بود، از بچه هایی بودم که تا برم یه چیزی از مغازه بخرم از وسط راه برمیگشتم دوباره میپرسیدم چیا باید بخرم؟! شاید چند بار برمیگشتم اخرشم قسمتی از خرید رو اشتباهی انجام میدادم، از توابع شهرستان هریس آذربایجان شرقی هستم، فکر کنم دوم ابتدایی مهاجرت کردیم تبریز، مادرم قالی بافی میکرد و پدرم کارگر نانوایی بود، آخرین بچه خونه بودم و از زمانی که علی رو شناختم کار میکنه، توی روستاها یه عرف بود، همه باید کار کنن! مام کنار آبجیم بعد یا قبل مدرسه قالی می بافتیم ولی حین قالی بافتن تو ذهنم هزارتا خیال میبافتم که قراره تو آینده چیکارا بکنم، در نهایت من دوم ابتدایی رو توی املا مردود شدم، دلیلشم معلوم هست ما به زبان خودمون نمیخونیم و فکر کن معلم میگه آب بابا و من نه میدونم آب چیه نه میدونم نان چیه، باید هم نوشتار هم معنی و.... کلی چیز رو یکجا یاد بگیرم و خوب من از روستا اومدم و توی روستا سطح آموزش افتضاح هست، معمولا آخر ترم معلم نمره میده تا مبادا خانواده بگن این درس خوان نیست و دیگه نذارن بیاد مدرسه!! زیاد وارد اونجا نمیشم!! پدرم خیلی عصبانی شد و کتکی هم خوردم، باید سراسر تابستون رو کنار قالی بافی این املا رو هم امتحان بدم تو ماه شهریور تا بتونم سوم ابتدایی برم، در نهایت نتوستم نمره درستی بگیرم و مردود شدم، سال شروع شد و دوباره نشستم سر کلاس دوم! کیا دوسالن؟ من دستم رو بردم بالا و معلم گفت چرا  گفتم با نمره 9 املا مردود شدم!! اونم زود رفت با مدیر صحبت کرد و دوباره امتحان گرفتن و منو انداختن سوم ابتدایی!! آره خوشحال بودم چون قرار بود پدرم رو سوپریز کنم و حیثیت به باد رفتم رو پیش محله و فامیل به دست بیارم!! خلاصه با هزار و یک بدبختی اومدیم رسیدم به راهنمایی و دیگه قالی رو هم کنار گذاشتیم، شروع کردم یاد گرفتن نانوایی، حدود سیزده سالم بود، تمام وقت مثل یه انسان بالغ تونستم تو یه نونوایی کل تابستون رو کار کنم، بعد تابستون صاحب نانوایی یه پسری داشت عباس، گفت وقت هایی که مدرسه میری من کار میکنم وقتیم از مدرسه برگشتی جامون رو عوض میکنیم!! یادمه نانوایی تا ساعت 5 بعد ظهر بود و از صبح ساعت 4 شروع میکیردیم، صب 3 بیدار میشدم میرفتم تا صب 7 و هفت به  بعدش میرفتم مدرسه، ساعت 12 مدرسه تعطیل میشد می اومدم تا ساعت 5 بعد ظهر دوباره کار میکردم!! مدارس هر دو هفته شیفت عوض میکرد، اونم باز با عباس پسر صاحب مغازه شریکی کار میکردیم!! کار نانوایی خیلی سخت هست و منم یه الف بچه بودم، وقتی ساعت سه صبح بیدار میشدم راه میوفتادم برم مغازه توی اون تاریکی میترسیدم :) گاها فکر میکردم یه چیزی پشت سرم داره منو دنبال میکنه :) ولی بدتر از همه بی خوابی بود و با خودم میگفتم ببین همه خوابن ولی تو باید بری کار کنی، وقتیم سرمای زمستون شروع میشد اونم سرمای آذربایجان، نگم با اون کفش های شادان :)) یخ میزد پاهام تا برسم مغازه، فکر کنم شیش کیلیومتر بود تا مغازه، صبح ها تو زمستون چون زمین یخ هست کسی مسافر کشی نمیکرد!!! هنوزم صدای سوز باد سرد و کنارش صدای اذان مسجد ابوموسی تو گوشم می پیچه!! خیلی صدای عجیبی داشت این موذن :) اوایلم خوشم نمی اومد! ولی بعدا حال میکردم باهاش!! هدفون و فلان که مالش نبودیم :) آهنگ اذان صبح و صدای باد و باران تو اون سرما موسیقی ما بود تا برسیم به  نانوایی!!! اینکه من کار کردم بچگیم رو ناراحت نیستم! اون موقع ها شاکی بودم ولی بعدا که بزرگ شدم نظرم عوض شد!! ما خانواده پولداری نبودیم ولی به کسیم نیازی نداشتیم پدرم و مادرم و آبجیم اینا کار میکردم و خیلی خوب زندگیمون میگذشت!! شد سال 86 و من میخاستم زیاد پول دربیارم و تصمیم گرفتم تابستون رو بیام تهران کار کنم، پولش خوب بود، ما تمام پولی که کار میکردیم رو میدادیم خونه و مقداری ازش رو ورمیداشتیم برای خودمون، خیلی کم ولی همون کمش نسبت به هم سن و سال های  پایین شهر خودمون زیاد بود، اگر تهران کار میکردم میتونستم یکسری لوازم الکتورنیکی بخرم مثل هویه و کیت الکرونیکی ... خلاصه تابستون رو اومدم پیش یکی از فامیلامون شروع کردم به کار ولی متاسفانه تهران نانوایی ها خیلی کار میکردن و حدود 18 ساعت باید روزانه کار میکردیم، گرمای تهران و گرمای نانواییم جای خودش، خیلی خسته میشدم و بی خواب، روزی 5 ساعت خواب، تابستون گذشت و برگشتم تبریز و حدود سیصد تومن پول داشتم حدود صد تومنش رو دادم به مادرم بقیش رو هم گفتم قراره یکسری لوازم بگیریم برا مدرسم لازمه دروغکی :) فکر کنم با ده تومن، بیشتر چیزایی که میخاستم رو خریدم و شروع کردم به ساخت این کیت ها، هر کیت صدای متفاوتی داشت... خلاصه اول نظری رو شروع کردیم و چون آخرهای تابستون اومده بودم ظرفیت مدارس پر شده بود، تو یه منطقه دیگه غیر منطقه خودمون شروع کردیم به مدرسه و همزمان باز با عباس نصف نصف کار میکردم خلاصه اون سال تموم شد از شانس بدم باز مردود شدم و ادامه ندادم مدرسه رو! از این طرفم اعتیاد شدیدی دارم به مدرسه، دلیلش بخاطر راحتی مدرسه هست چون کار نمیکنم میشینم بیکار تو کلاس و اینجوری میتونم از کار دربرم، از طرفیم مدرسه رو هم دوست دارم چون بدون اینکه تو خونه درس بخونم یا تو کلاس جزوه فلان بنویسم شاکرد دوم یا سوم میشدم!! لامصب نشد شاگرد اول بشم تو دلم موند :)  ولی اون سال بخاطر یکسری چیزها نشد برم مدرسه و یک سال بعدش شبانه خوندم اول نظری رو. تمام معلم هام به میگفتن تو همیشه با لباس کار میای مداد دفترم نمیاری ولی از همه نمره بالاتر میگری کجا میخونی تو چجوری میخونی!! دنبال راز موفقیت من بودن:) منم بچه بودم یکسری دروغ تحویلش میدادم، آره من شبا تا تکالیف رو انجام ندم نمیخابم:) نمیدونم باور میکردن یا نه ولی پیش خودم فکر میکردم این دروغ هارو بگم فکر میکنن خیلی خفنم نگو که خفنی تو این بود که هیچی نخونی ولی نمره بالارو بیاری!! من عاشق دمپایی بودم (گرمایه نانوایی) همیشه با دمپایی میرفتم همه جا یه روز یکی از معلم ها گفت برات میخایم از مدرسه کفش بخریم!! یاد نمیره گفتم آقا اگر بخاین من براتون کت شلوار بگیرم، بچه نبودم من هرچند 16 سالم میشد یا نمیشد ولی کار و سختی های زندگی بهم خیلی چیزها یاد داد اینکه بشکن و تیکه پاره شو ولی برا کسی خم نشو، اینکه ارزش انسان ها به پول و لباس نیست ...خلاصه اون سالم تموم شد و باید میرفتم انتخاب رشته، ما تو خانواده باسواد نداشتیم مادرم و پدرم بیسواد بودن خواهرمم داشت میخوند کمو بیش، خلاصه بخاطر نداشتن انضباط هیچ جا قبولم نکرد و همین شد رفتم کاردانش و حسابداری شروع کردم خوندن! کدوم مدرسه دانش آموزی که از شبانه اومده و نمره انضباط 17 داره رو قبول میکنه!! اون سالها فکر کنم 87 -88 اینا بود خیلی چیزها بهم اضافه کرد، از یه طرف دوران بلوغ، از طرفیم آشنا شدنم با یکسری افراد، (خیلی جاهارو رد میکنم چون نمیخام زیاد طولانی کنم) خلاصه  مدارس شروع شد، حسابداری نصف درس های کامپیوتر رو داشت مجموعه آفیس ورد اکسل اینا... یه معلم داشتیم آقای خدایی خیلی باسواد بود تو کامپیوتر، برا ما شروع کرد داس رو درس دادن و من اولین بار کامپیوتر رو تو گارگاه مدرسه دیدم، اقای خدای هم هر سوالی داشتم با حوصله جواب میداد، اینم بگم دانش آموزی بودم که معلم هارو سوال پیچ میکردم، این بنده خدام با حوصله جواب میداد، من به سرعت یاد گرفتم آفیس رو و شروع کردم تو اکسل فرمول نویسی و سوالاتم هی بیشتر میشد که در نهایت گفت این چیزهایی که میخای رو باید توی VB6 بنویسی بعدش بیاری اکسل، شما این درس رو ندارید کامپیوتری ها دارن، من رفتم بیرون تو یه آموزشگاه وبی یاد بگیرم و چون رایانه کار درجه دو داشتم از حسابداری، یک رو هم میگرفتم بهم دیپلم کامپیوتر رو میدادن، چون دروس مشترکش رو تو حسابداری مثل تاریخ اینا پاس کرده بودم، خلاصه با نمره 100 قبول شدم از رایانه کار درجه یک، یادمه صاحب آموزشگاه بهم گفت بیا اینجا وبی تدریس بکن! نمیدونم چرا قبول نکردم الانمشم نمیدونم چرا نرفتم، من تو سوم هنرستان تونستم دوتا دیپلم رو بگیرم. پولم نمیرسید کامپیوتر بگیرم بخاطر این میرفتم کافینت!! بیشترم با یاهو مسنجر میرفت زمانم!! من کتاب جاوا هربرت شیلد رو گرفتم و کتاب گام به گام هک و شروع کردم خوندن، یه کتاب هزار صفحه ای بود ولی چیزی ازشون سردر نمی آوردم، اون کتاب هک در مورد شبکه های کامپیوتری و پروتکل TCP/IP توضیح میداد منم میخونم ولی هیچی نمیفهمم ولی هرچقدر میره جلوتر کتاب، دیگه چشم به کلمات تخصصی آشنا میشه از این ورم جاوا رو میخونم!  نمیشد باید کامپیتور میداشتم ولی پولم نمیرسد، دوباره برگشتم تهران و چند ماهی کار کردم و برگشتم، مادرمم یه قالی بافته بود اونو فروخت بهم یه کامپیتور خرید، یادم نمیره اون روز رو!! گفتم این سالهای دبیرستان با خیلی افراد آشنا شدم و خیلی برام مهم بود، تو اون سالها با یه بنده خدا سعید امامی آشنا شدم که طلبه بود و فلسفه میخوند و معمولا طول هفته شب ها باهاش بحث میکردم، من هم فلسفه اسلام هم فلسفه غرب رو هم اون سالها داشتم میخوندم و اصلا فکر نمیکردم فلسفه قرار هست زندگی منو کلا دگرگون کنه، یکم از پولی که تهران کار کرده بودم هنوز داشتم حدود دیوست تومن (خیلی بود) رفتم یه استاد گرفتم بهم جاوا یاد بده، بیست جلسه رفتم اما هیچی یاد نگرفتم، هیچی که چی بگم راضی نبودم از چیزهایی که یاد گرفتم ولی دیگه کامپیوتر داشتم، روز اول که رسید کامپیوتر خونه ویندوز رو عوض کردم، فکر میکردم ویندوز رو من نوشتم اینقدر تحت تاثیر قرار گرفته بودم، شوخی نبود، اون زمان ها هر کسی بلد نبود مخصوصا مثل منی که کامپیوتر تو خونش نبود، بعدش مادربرد خراب شد رفتم دادم گارانتی ولی نشد فلان و تو این حین پام باز شد پاساژ کامپیوتر و به ناچار سخت افزار کامپیتور آشنا شدم یه مدت رفتم اومدم، دیدم من میتونم یه کامپوتر رو صفر تا صد جمع کنم، اوایل سیستم خودم رو ارتقاع میدادم برا دوستان میخردیم فلان بعدش مغازه فروش کامپیوتر باز کردم، فکر کنم 18 سالم بود، هم سخت افزار هم نرم افزار همه کاری میکردم پول خوبیم داشت، طولی نکشید که کلی مشتری داشتم از موبایل متنفر بوودم یه بند زنگ میخورد، اینم بگم اوایل روم نمیشد از یکی پول بگیرم کلی رایگان برا پرو روها کار کردم!!! کنار این کارها دانشگاهم امنیت اطلاعات دارم میخونم و همزمان کد میزنم، یه روز یه دوستی داشتم دیدبان میگفتیم بهش، خوشم نمیومد بچه پولدار محل بود و خیلی مغرور بود، البته بخاطر مغرور بودنش خوشم نمیومد از قضا اینم با دوست من صمیمی بودن و گفتن بریم چهار راه از اونجا من میخام جدول سودگو بگیرم، چی هست چی نیس، اینم گفت اره پرش کنی بفرستی بهت سکه میدن! رفتیم خریدیم این تو راه برگشت بهم توضیح داد، منم گفتم بیا برات کدش رو بزنم خودش حل کنه هر ماه سکه رو ما ببریم :) شروع کردم به نوشتن سودوگو، هنوز چیزی به اسم جستوجو تو اینترنت نمیدونم!! با کلی ایف و فور فلان نوشتم کار کرد! ولی اگر خیلی سخت میبود سودوکو حل نمیکرد منم ولکن نبودم و شیش ماه بود کل زمانم رو گرفته بود مشتری هارم خیلی وقت ها جواب نمیدادم و رو این کار میکردم بلاخره در نهایت فهمیدم که بعد شیش ماه باید با هوش مصنوعی حلش کنم :) منی که به غیر دوتا ایوف دوتا فوور چیزی نمیدونم میخام هوش یاد بگیرم! رفتم کتاب الگوریتم ژنتیک کلونی و ... گرفتم اومدم خوندم ولی چیزی سر در نمیارم، بعد سه ماه تونستم ااگوریتم ژنتیک رو تستی بنویسم با هزارو یک خطا، بعدش دیدم میشد همه اینارو از اینترنت دانلود کرد(درس اول زندگی کاریم) رفتم کدهارو دانلود کردم ولی مشکل این بود نمی تونستم کدی که از گیت ورداشتم رو اجرا کنم ... اونم یاد گرفتیم حالا میترسم به کدهاش دس بزنم چون خیلی حرفه ای نوشته بودن، منی که کل کدهام توی یک فایل هست اینا کلی فایل با اسم های جدا فلان ... یواش یواش توستم یه تغیراتی بدم و سودوکو رو تموم کنم، اونجا بود با الگوریتم های جستوجوی آگاهانه آشنا شدم و بحث NP، گفتن که نمیشه جدول زمانی دانشگاه رو حل کرد تو نرم افزار چون NP هست، دست بکار شدم تو جاوا شروع کردم، این وسط پایتون و سیشارپم گاهی میرفتم می اومدم ولی جاوا چون خیلی خونده بودم و اون سالها تو بورس بود فکر میکردم جاوا کار کردن خودش خفن هست!! خلاصه من جدول زمانی رو شروع کردم و ... توی دانشگاهم امنیت میخوندم، از قبل کلی کتاب خونده بودم و برنامه نویسیم بلد بودم، توی کلاس وقتی استاد درس میداد شبکه فلان رو من تازه دو هزاریام میفتاد که اون کتاب اون موضوع این بود!! اینم بگم به شدت حافظه خوبی داشتم اون سالها، شروع کردم به نوشتن تولزهای هک مثل کیلاگر، اسنیف شبکه ،خوندن پسورد های سیو شده مرورگر و دکود کردن و ایمیل کردنشون تو بگراند... یواش یواش اومدم سمت موبایل! یادمه سال 93 هنوز برنامه نویسی موبایل اینقدر تو بورس نبود، ملت تو وبش مونده بودن اما من برا اندروید تروجان نوشتم که همه چیرو شنود میکرد از میکرفون  تا پیام ها و ایمیل و ... بعدشم شروع کردم به اسکپولایت نویسی نمیدونم چرا همیشه چند پیرهن بزرگتر از خودم رو باید انتخاب میکردم! سخت بود، باید اسمبلی و پایتون و پرل و زیرساخت شبکه و سیستم عامل .... بلد میبودم تا بتونم، اما میدونستم میتونم چون من خسته نمیشدم، صب وقتی در خونه صداش می اومد می فهمیدم صب شده و پدرم رفت سرکار، زود چراغ رو خاموش میکردم تا مادرم صدام نکنه بیا صبحانه یا برو فلان چیزرو بخر!! روزی فکر کنم سه الی چهار ساعت میخابیدم بقیش رو سیستم بودم و میخوندم و می نوشتم. سال 94 اینا بود از تحقیقات مخابرات کشور یه بنده خدایی گفت ما یه پروژه داریم در مورد آسیب پذیری های موبایل بیا تهران باهم همکاری کنیم، منم رفتم ولی سر قیمت توافق نکردیم!! من جایی رسمی کار نکرده بودم ولی حرفه ای بودم چون کلی تولوز امنیتی برا نهاد های امنیتی کار کرده بودم و کسی بودم که نهاد های امنیتی رو قانع کرد از روس ها تولز نخرند،تا من یک پنجم قیمتش براتون بنویسم و نوشتم ... دیگه از سال  94-93 به بعد یه پام تهران بود یه پام تبریز هم دانشگاه هم فروش کامپیتور هم توسعه تولزهای امنیتی، خلاصه سر قیمت با تحقیات مخابرات توافق نکردیم برگشتم تبریز، تا برگشتم از یه شرکتی بهم زنگ زدن که بیا مصاحبه، مصاحبه باز با یکی از مدیرهای تحقیقات مخابرات بود که توی این شرکتم مدیر گروه نرم افزار بود، ولی پاره وقت بود تو این شرکتی که قرار بود برم مصاحبه. اومدیم مصاحبه و بعدشم شروع کردم توی پویندگان کار کردن، شرکت خوبی بود، اولین کار رسمی من بود ولی من جونیور نبودم چون از شیش سال پیشش داشتم کد میزدم و پروژه مینوشتم... خودمم خیلی تحویل میگرفتم اینم بگم، مدیر گروه ما آقای پ..ی خیلی کار بلد بود، من از ایشون خیلی چیزها یادگرفتم مخصوصا مهارت های نرم، کسی بود که به جوان ها اعتماد میکرد، منو فکر کنم شناخته بود که کاریم، منو دادن پیش اقای امامی کمک دستش باشم. فکر میکنم خیلی میدونم چون چه در سطح شبکه که سیکو رو خوندم چه در سطح نرم افزار که برای ویندوز و لینوکس و اندروید تولز امنیتی نوشته بودم فکر میکردم خفنم!! البته بودم :) تولزهای امنیتی داکیومنت و نمونه کد تو اینترنت ندارن خودتی و دانشت باید بشکافی بری جلو، از شانس خوبم افتاده بودم وسط دوتا دهه پنجاهی خفن، من از محمد رضا امامی خیلی چیزا یادگرفتم و ادم خیلی ساکت و شکسته نفسی بود و هر موقع اومدم تشکر کنم گفت حاجی حاجی نگو، شما خودت خیلی حرفه ای هستی آخرشم قبول نکرد که من کنارش یاد گرفتم و استادم بوده...سه چهار سالی که توی پویندگان بودم یه محصول رو توسعه دادیم تو زمینه علایم حیاتی بود، کنارش با دو سه جای دیگه هم کار میکردم هم پروژه های امنیتی هم سرپرست نرم افزاری یه شرکت دیگه هم بودم و تا دلتون بخاد کد کثیف و پروژه کثیف دیدم و از توشن کلی عبرت گرفتم!! سال شد نود شیش و همسرمم دانشگاهش رو تموم کرد، زبان انگلیسی اسپیکینگ نداشتم ولی میخاستم کشورهای دیگرم تجربه کنم شکر خدا تورک هستم و  ادبیات تورکیم خیلی علاقه دارم، تورکیه برای من مقصد خوبی بود و شروع کردم به دو سه تا شرکت رزومه دادم که دوتاشون تماس گرفتن و توافق کردیم، ویزام رو گرفتن و امدم 96 تورکیه و هدایت تیم نرم افزاری این شرکت رو به دست گرفتم و شروع کردیم به کار، از امنیت دور شدم چون پول خوبی نداشت مشتریشم فقط یکسری نهاد بود نمیشد به همه فروخت، از این ورم نرم افزار راحتر و استرس کمتری داشت و مثل امنیت نبود که داکیومنت پیدا نکنی اینجا همه چی متن باز و داکیونت پر هست، پولشم خوب هست نسبت به امنیت، این شد کلا نرم افزاری شدم. از اونجایم که یه جا بند نمیشم توی تورکیه هم شروع کردم با شرکت های متفاوت کار کردن، رسیدم به استاد جاوا !! شاید بگم بزرگترین استاد جاوا اغراق نکردم، جناب اقای آکین کالدیراغلو دارنده اولین جایزه اسکار جاوا در جهان، خونشون توی آیوالیک هست (تو پاندمی از آمریکا اومد دیگه برنگشت) شیش ساعت با استانبول فاصله دارم با ایشون و سعی میکنم سالی یکی دوباره برم از نزدیک برای عرض ارادت، ایشون زندگی نرم افزار منو عوض کردن، امیدارم بتونیم آخرهای سال یه سمینار کلین کد با حضور ایشون برگذار کنیم.این متن رو در حمایت از کمپین #من_هم_یک_جونیور_بودم  نوشتم و خواستم از این کمپین حمایت کنم.لینکدین #من_هم_یک_جونیور_بودم خوشحال میشم نظراتتون رو از لینکدینم بشنوم.  https://www.linkedin.com/in/ali-mahmoodi-tabriz/ </description>
                <category>Ali Mahmoodi</category>
                <author>Ali Mahmoodi</author>
                <pubDate>Wed, 24 Aug 2022 02:46:56 +0430</pubDate>
            </item>
                    <item>
                <title>مهندس نرم افزار کیست؟</title>
                <link>https://virgool.io/@ali.mahmoodi.heris/%D8%AF%D8%B1-%D9%BE%DB%8C%D8%B1%D8%A7%D9%85%D9%88%D9%86-%D9%85%D9%87%D9%86%D8%AF%D8%B3%DB%8C-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-1-mlsy4xiqdyde</link>
                <description>کیفیت کدواحد اندازه گیری کیفیت کد: به تعداد فوشهایی که برای درک کد در یک دقیقه برای نویسنده اثر اختصاص داده میشه، کیفیت کد رو مشخص میکنه :) کد مثل شعر یک اثر هنری هست، بعد شما قرار هست یکی اون رو بخونه، حین نوشتن کد، یک اثر هنری خلق کنید چون کسی کد رو بو نمیکنه یا نمیخوره!! میخونه و باید قابل خواندن باشد :)صلاحیت توسعه دهنده ها!ابتدا بنده قبل شروع پست گاردم رو بگیرم! هدف آزرده خاطر کردن یا تحقیر کردن هیچ کسی نیست، مطالب حتی خود من رو هم دربر میگیره - در فلسفه یکسری ریزورها هست که مثل چاقو برش دارهHanlon&#x27;s razor چیزی رو که میشه بهش اسم حماقت داد، به چشم سواسفاده دیدن کار اشتباهی هست. ما همه توسعه دهنده هستیم و همگی سعی داریم کار خوبی انجام دهیم و نیتمون همیشه خیر هست، ولی گاها به دلیل نبود دانش کافی و عدم صلاحیت کافی کارو خراب میکنیم و اینحا ریزور هنلونز میگه این شخص نیتش سو استقاده نبود، فقط حماقت کرده، ما اجازه نداریم این رو بر پایه سو استفاده قضاوت کنیم هم عادلانه نیست هم اخلاقی نیست، پس منم به عنوان توسعه دهنده خیلی جاها کدهای بدی نوشتم و دلیلشم عدم دید کافی بوده و سو نیتی نداشتم.با گاردی که گرفتیم و استباطی که از ریزور هنلونز میتونیم بکنیم، اینحوری بگیم، اگر وارد یه شرکتی میشید و چشم باز میکنید و توی دستتون یه پروژه میبینید که کدهام کثیف هستند اینجا نگید توسعه دهنده قبلی سواستفاده کرده و فقط پولش رو گرفنه، وقتیم دیده نمیشه استعفا داده رفته، هنلونز میگه اینجا ما میتونیم این رو با حماقت توجیه کنیم، شخص قبلی فقط حماقت کرده چون صلاحیت کافی رو نداشنه همین، نمیشه قضاوت کرد که داشته از شرکت سواستفاده میکرده چون چنین قضاوتی خیلی غیر اخلاقی هست.من گاردم رو گرفتم و بازم میگم به عنوان توسعه دهنده هممون نیتمون خیر هست.افراد جونیور و کسانی که تازه وارد این رشته شدن مورد هدف این متن نیست.بر گردیم به اصل موضوع.چرا بیشتر توسعه دهندها صلاحیت کافی برای پیشبرد پروژه رو ندارن ولی با این حال دنبال اینن که مدیریت پروژه رو به دست بگیرن، بعدشم با حماقت هاشون هم وقت تیم هم بودجه شرکت رو به باد بدن، اخرشم پروژه شکست میخوره، اصلا خودش رو مقصر نمیدونه!!آیا برای هدایت تیم و پیشبرد یه پروژه نرم افزای داشتن تخصص برنامه نویسی کافی هست؟مهندس نرم افزار کیست؟مهندسی نرم افزار چیست؟خوب به دلیل اینکه نمیشه همه اینارو توی پست جا داد و لینکدین محدویت کلمه داره، از طرفیم معقوله مهمی هست من در قالب مقاله آوردم تا دوستان هم بتونن نظر خودشون رو بدن تا به یه جمع بندی برسیم.همانطور که میدونید مدیریت، لیدر بودن یه علم جدایی از مهندسی هست و یه مهندس خوب لزوما یه مدیر خوب نیست، یعنی اگر ده ساله دارید توسعه دهنگی میکنید لزوما صلاحیت لیدری یه تیم نرم افزاری رو ندارید، کسیم که لیدر هست لزوما مهندس نرم افزار خوبی نیست.پس وقتی یه جایی چند سال کار کردیم زود هوس مدیریت برمون نداره که من اینجا قدیمیم و باید بهم پست مدیریت بدن! اگر چندین سال توسعه دهندگی کردی که مدیر بشی! باید بگم راه رو اشتباه اومدی چون علم مهندسی با علم مدیریت از دور و نزدیکم به هم ربطی ندارن و بهتر بود شما از اول مدیریت بخونی و برای ارضای اگو خودت یا نمیدونم ارضای نیازهای مادیت میرفتی پی مدیریت، بخاطر حماقت و جاه طلبی شما قرار نیست تیم زیر دستت باشه و کلی هزینه بالا دست شرکت بگذاری آخرشم بگی مقصر شما هستین و شما از نرم افزار چیزی نمیدونید!!  برای مدیریت باید علم مدیریت خوند و سافت اسکیل بالایی داشت.اگر دقت کنید یکسری سوالات پایه ای رو مطرح کردم، این سوال رو از یه برنامه نویس یکساله بپرسی یه تعریفی داره از یه برنامه نویس با ده سال تجربه یه تعریفی داره!!!شاید یکی بگه بخاطر انتزاعی بودن نرم افزار هست که هر کسی یه تعریفی دارد، میشه گفت بله! خود معقوله نرم افزار انتزاعی هست، ولی مهندسی نرم افزار خیرمهندسی نرم افزار از نظر اقای وود یکی از پیچیده ترین مهندسی های جهان هست، الان نمیخام وارد پیچیدگی بشم یه مقاله قبلا در مورد پیچیدگی نوشتم می تونید از اونجا نگاه کنید. وقتی ما به دیگر علوم مثل ریاضی و یا پزشکی، فلسفه نگاه میکینم میبینم این علوم بالای چندین قرن هست که داره از طرف ملل های شرق و غرب توسعه داده میشه! از زمان سینوهه تا بو علی و … ولی مهندسی نرم افزار شصت سالش نشده!! هنوز یه بچه نوپا هم نیست، تعریف دقیق این علم رو شاید بعد گذشت چند صد سال مثل دیگر علوم در آینده بشه نوشت ولی الان فقط میتونیم برحسب دیده هایی که در جهان و در عمل از این مهندسی میبینم تعریف کنیم، پس با یه علم ناشناخته و خیلی نوپا،پویا ...رو در رو هستیم که گاها بخاطر اشتباه یکسری افراد ضرر های ملیون دلاری به جهان وارد کردن و هنوزم به قوت خودشون ادامه میدن مثل نال پوینتر ها!! بیایم در پیرامون تعریف این مهندسی یکم بیشتر صحبت کنیم و از دید شرکت آی بی ام که سالهای دوهزار میلادی یو ام ال رو به عنوان زبان مشترک بین توسعه دهندها عرضه کرد، بعدشم آر یو پی رو دادن که از نظر من یکی از نفیس ترین منابع در پیرامون مهندسی نرم افزار هست و میشه گفت تا به الان هیچ شرکتی نتوسته در مورد این علم چنین تعاریف و ابزار جامعی عرضه بکنه، نمیخام اینجا تایید کنم این مدل رو، اینم دارای ایرادات هست چون اینام مثل منو شما با یه علم نوزاد طرف حساب هستند.این نوزاد رو هر کسی میخاد یه مدلی بشناسنه، هر کسی میخاد مثل این نوزاد به دنیا بیاره، ولی به دلیل عدم شناخت این علم دانشگاها عاجز موندن و نمیدونن چیکار باید بکنن که بعد فارغ التحصیلی یه دانشجو نرم افزار بتونه یه نرم افزار رو تولید بکنه!!!موضوع از همنیجا منفجر میشه، چرا که افراد چندین سال زحمت میکشن، درس میخونن در دانشگاه ولی وقتی با یه نرم افزار خیلی ساده رو به رو میشن هنگ میکنن!! در مقاله های قبلیم توضیح دادم در مورد ذات نرم افزار که اصلی ترین ذاتش پیچده بودنش، قابل تغییر و قابل دیده نشدنش هست، توی دانشگاه نمیتونه استاد به دانشجو یاد بده، ولی در اینور شما میبینی یکی بعد از فارغ التحصیلی از مهندسی عمران یا دکترای پزشکی وارد  بازار کار میشه و خیلی زود شروع میکنه به کسب درامد و میتونه به خودش مهندس بگه... توی مهندسی نرم افزار کار هر کسی نیست که بتونه به خودش مهندس نرم افزار بگه!! این علم خیلی خیلی پیچیده هست و دارای ابعاد مختلفی هست، تنها به داشتن توانایی فنی نیست، چون وقتی یه پروژه رو میخای شروع کنی یه قسمت وصله به مشتری که انسان هست! پس باید بلد باشی تعامل با انسان رو، از طرفی هم باید بتونی نیاز مشتری رو بهتر از خودش بدونی، باهاش همدردی بکنی تا نیازهاش رو درک کنی.  همچین دنیایی نداریم که بگیم من نابغه نرم افزار هستم ولی نمیتونم دو کلام با تستر یا مشتری بدون دعوا و خونریزی صحبت کنم.به نظر شما دلیل اصلی مشاجره بین برنامه نویس و مشتری یا تیم فروش یا تیم تست چیه؟ به نظر شما اقای اریک چرا اومد زبان مشترک رو پیشنهاد داد؟ به نظر شما چرا شرکت های بزرگ هر روز با متد های متفاوت، مثل تست نویسی، سعی دارند این مشاجره و اشتباهات رو به حداقل برسونن؟از همین جایی که وایسادیم با تعاریف بالا به مهندسی نرم افزار نگاه میکنیم، متوجه میشیم آتیشش خیلی تند هست و نمیشه با صبح اومدن و شب رفتن به خونه تو این رشته موفق بود، چون این رشته هوش و پشتکار میخاد، اگر امروز و فردات هیچ تفاوتی نداشته باشه موفق نمیشی، این رشته گاو و گوسفند پرست نیست بیشتر شعور و سخت کوش پرست هست! حالا سخت کوشهاشونم کاسه چه کنم دستشون هست، با چند ماه کارآموزی و دوتا فیلم اموزشی نمیشه مهندس نرم افزار شد!! یه کد نویس مبتدی میشید،یه توسعه دهنده نمیشید.توسعه دهنده گیست؟کد نویس کیست؟کد چیست؟افراد نا کاربلد توی این رشته خیلی زیاد هست، خودشون محتاج آموزش هستند، دارند آموزش میدن، خودشون محتاج نقشه راه هستن ولی دارند منتوری میکنن، خودشون الف بای مدیریت رو نمیدونن شدن کوچ، اسکرام مستر :)این افرادی که میگم توی دنیای نرم افزار واقعا شاهکار هستند و اینقدر که اینه اعتماد به نفس دارند هیچ حیوان درنده و برنده ای نداره !!اسم تحلیل گر سیستم گذاشته برا خودش رفته با مشتری صحبت کرده، امده رو کاغذ به توسعه دهنده راه نشون میده و میگه من تحلیل کردم شما پیاده سازی بکن! حالا هی بهش بگو این کارا اینجوری پیش نمیره!شاید به من بگید اقا یکم با ادب باش ولی واقعا دارم خودم رو کنترل میکنم! افرادی که هیچ صلاحیتی ندارن و میان به توسعه دهنده راه نشون میدن و بدترش، میگه توسعه دهنده احمق هست و چیزی که من خواسته بودم رو اشتباه متوجه شد!! سیب خواستم بهم هندوانه داده؟! داخل عمل انجام شده هم میگذاری شروع میکنه حاشا و داد و بیداد :) فک کن یکی بگه دکترم اما جیزی بارش نباشه!!حالا اگر اینجا توسعه دهنده خودشم صلاحیت کافی نداشته باشه واویلا میشه و باید دعا کرد به حال تیمی که بعد اینا قرار هست محصول اینارو به دست بگیره؟بعدشم میان میگن توسعه دهنده جماعت بی نظم هست، زیاد حقوق میخاد، بد قول هست؟دلیل بدقولی توسعه دهنده ها چیه؟کسی که با دوتا فیلم آموزشی میاد برنامه نویس میشه اون یکیم با دوتا دوره میشه کوچ و اسکرام مستر معلومه که وجود یکی از این موجودات در تیم باعث شکست پروژه میشه و باعث بد قولی میشه، اگر پروژه به موقع تموم بشه دست آورد کوچ، مدیر، اسکرام مستر هست، شکست بخوره مقصر توسعه دهنده هست، باید اخراج بشه یکی دیگه بیاد! این چرخه ادامه دارد، در نهایت در ذهن همه از برنامه نویس یه موجود ترسناک بدقول میسازن؟کسی که صبح میره و شبم میاد و روزهاش کلا فرقی نداره نمیتونه مهندس نرم افزار بشه.وقتی برا پروژه زمان میدی دوماه! ولی توی شیش ماه هنوز نتونستی نصف کارو جلو ببری یعنی صلاحیت کافی نداری و باید زیر دست یه سینیور کار کنی و یاد بگیری.اگر نمیدونی پروژه رو از کجا شروع کنی یعنی صلاحیت کافی نداری و راه زیادی داری مهندس نرم افزار بشی و هنوز در سطح جونیور هستی!اگر نمیتونی به عنوان لیدر پروژه اهمیت و زحمت کار رو به بالا دستی ها نشون بدی، صاحیت کافی نداری باید روی مهارت های نرم زیاد کار کنی و با توجیه اینکه مدیر بالایی بی سواد هست نمی فهمه! اگر در طول تمامی چرخه های نرم افزار کیفیت مطلوب رو نداره محصول و بهانت اینه عجله داشتیم، زمان کم بود ،بخاطر امنیت و پرفورمنس کد ها کثیف هستن!! شما صلاحیت این کارو نداری نیاز هست رو خودت بیشتر کار کنی!! فکر کنم کسی قبول نمیکنه وقتی دکتر عمل قلب انجام میده بگه عجله داشتم یا میخاستم سریع تموم کنم بخاطر این کشته شد!اگر نمیتونی با تیم کار کنی باید روی سافت اسکیل هات زیاد کار کنی، نرم افزار خیلی پیچیده هست و کار یک نفر نیست: وقتی دکتر داره جراحی میکنه، یکی داره عرق پیشونیش رو تمیز میکنه! یکی داره علایم حیاتی رو چک میکنه! یکی داره ابزار میده یکی داره محل خونریزی رو تمیز میکنه! اگر دکتر تنهایی وارد اون عمل بشه بیمار از دست میره!! مهندسی نرم افزار هنوز ناشناخته هست فعلا یه گروه هم به امنیت، پرفورمنس، تمیزی، تست .. نگاه میکنه، در آینده هر قسمت مجزا تیم خواهد داشت، مثل پزشکی و شاخه های متعددی به وجود خواهد آمد طوری که مهندس توسعه دهنده پرفورمنس، فقط روی پرفورمنس کار خواهد کرد مثل دکتر قلب یا مغز.کسی که دنبال پست مدیریت هست و همیشه رقابت سر مدیر شدن داره نمیتونه توسعه دهنده موفقی باشهکسی که سافت اسکیل قوی نداشته باشه نمیتونه مدیر فنی موفقی باشهکسی که سافت اسکیل و هارد اسکیل قوی داشته باشه و در کنارش سالهای طولانی چندین نرم افزار در چندین تیم متفاوت تجربه داشته باشه میتونه وارد مدیریت، منتوری، کوچ شدن بشه ولی باید سرش به تنش بی ارزه با یه پروژه در سطح شهری یا استانی نمیشه این چیزا!!میگه بدون وضو نماز میشه خوند! میگه ما خوندیم شد :) حال روز بیشتر کارکنان در دنیای نرم افزار هست، درصد زیادی صلاحیت کافی ندارن و شرکتم توانایی تشخیص نداره،  همینجوری دارن تخته گاز منابع رو هدر میدن و از خودشون گیگ ساختن! متاسفانه با یه هودی و یه اسپرسو نمیشه! سیگار شاید به کارش بیاد!!باید بتونه آنالیز ریسک بکنه ،  راحل های بهینه بده و برای هر چیزی راحل کد نویسی نده!!!باهوش بودنش میتونه اونو به توان برسونه ولی لزوما نیازمند هوش بالایی نیست.اونایی که به دلیل درامد نسبتا خوب این رشته میان به این بیزینس، به نظرم دوبار فکر کنن چون هر کسی نمیتونه موفق بشه تو این کار، نبود صلاحیت کافی باعث میشه همیشه تو اسرتس باشه و اخرشم نتونه به جایگاهی که میخاد برسه، یه مدت بعد دید نمیشه میره دو روز کلاس اسکرام میاد شده اسکرام مستر یا کوچ بعدش ضررهای میلیاردی به شرکت ها و ضررهای معنوی به روحیه و ذهن توسعه دهنده ها میزنه!! همیشه هم شاکی هست از زمین و زمان، اگر این نشانه ها رو داری یه لطفی به خودت ما بکن برو دنبال یه کاری که توش صلاحیت داری،  تاوان عدم صلاحیت شمارو نباید شرکت ها تو توسعه دهنده ها بدند.این وسط افراد مستعد و  خیلی کاربلدم داریم که خدا سایشون رو از بالا سرمون کم نکنه و چند تا محصول درست حسابی که تو بازار میبینم بخاطر برکت وجود این متخصص ها هست.توسعه دهنده ای که همیشه دعوا داره با تیم تست، بهتر هست یه فکری به سافت اسکیل هاش بکنه اگر دید نشد! یه لطفی بکنه از دنیای نرم افزار خدا حافظی بکنه.اگر برای یاد گرفتن خودت میخای یه تکنولوژی رو وارد پروژه بکنی، شما صلاحیت کافی رو نداری و راه زیادی با مفهموم مهندسی نرم افزار داری.اگر روز یا هفته هات بدون تغییر در سطح علمیت یکسان میمونه، هرچه سریعتر تغییر شغل بده یا که یه فکری بکن به حال و روزت و تا زمانی که درستش نکردی پیش یکی که صلاحیت داره کار بکن و پروژه ملت رو نگیر دستت، آموزشم نده!! همه یوتوبر شدن :) بیست سالش نشده عنوانش مهندس نرم افزار هست!! ارزش هر چی مهندس نرم افزار هست رو یکجا به باد داده و جایگاه اجتماعی و درآمدی این حیطه رو به گند کشیده! در ادامه مقاله سعی خواهم کرد در مورد مولفه های مهندسین نرم افزار و افراد مستعد و افراد با صلاحیت کافی رو بیشتر توضیح بدم و وارد اجزای مهندسی نرم افزار از لحاظ مفهومی بشم تا ببنیم مهندسی نرم افزار چیست و چه کسی مهندس نرم افزار هست، شرکت ها برای پیشبرد پروژه نیازمند کدام نیرو هستند و چه کسی صلاحیت لیدر، کوچ، منتور و اسکرام مستر رو داره! در مورد مهارت های نرم بیشتر صحبت خواهیم کرد و دلیل نیازمندی به این توانایی هارو خواهیم نوشت!! </description>
                <category>Ali Mahmoodi</category>
                <author>Ali Mahmoodi</author>
                <pubDate>Wed, 10 Aug 2022 01:03:42 +0430</pubDate>
            </item>
                    <item>
                <title>Functional VS OOP</title>
                <link>https://virgool.io/@ali.mahmoodi.heris/functional-vs-oop-q4267xnzbjaz</link>
                <description>در این مقاله مباحثی خواهد شد که نیازمند تجربه و تفکر باز هست، بجای احساسی شدن، حمله کردن به مطالب یا نویسنده، اجازه بدیم تفکرات جدید وارد چرخه حرفه ایمون بشه.در ایونت هایی که هر هفته برگزار میکنیم رسیدیم به بحث فانکشنال پروگرمینگ و از تاریخچه، اصل ها،چیستی، و چرایی ها بحث کردیم، در این مقاله و در مقالات بعدی یکی یکی اصل های پارادایم فانکشنال رو به دست خواهیم گرفت و به صورت دقیق برسی خواهیم کرد.توی کتاب Becoming Functional آقای بکفیلد اساسهای فاکشنال پروگرمینگ رو مورد برسی قرار می‌دهد و می‌گوید در بین این هفت اصل، سه اصل آخر رو همفکر نیستیم ولی یکم بالا یکم پایین فانکشنال پروگرمینگ باید این اصل هارو داشته باشد، توی فانکشنال معمولا همراه با اثبات ریاضی میریم جلو، بعدش شروع به پیاده سازی میکینم‌، خروجی هر فانکشن ورودی فانکشن دیگری هست، هیچ فانکشن حق نگه داشتن استیت، حق تغییر متغییر دیگر اجزارو ندارد، تنها  ورودی یا خروجی دارد، به چه کسی بر چه هدفی انجام وظیفه می‌کند بی‌خبر هست... همه مباحث رو با مثال ها و توضیحات کافی صحبت خواهم کرد ولی بدون مطالعه امکان هضم این مطالب امکان پذیر نیست و باید دست به کد ببرید و مثال هارو خود شمام پیاده کنید، این مثال ها توی گیت موجود هست.Higher Order FunctionPure Function​Recursion​Immutable​​Nonstrict evaluation​Statement​Pattern matching​متد های با اولویت بالا یا شهروند درجه یک.همانطور که گفتم ما توی شیگرا همچین کانسپت هایی رو نداریم ولی وقتی وارد فانکشنال میشیم یکسری مفاهیم رنگنشون عوض میشه، فانکشن هایی که ما تا به امروز شناختیم با فانکشنی که این پارادایم تعریف میکنه چه به لحاظ مکانیک، چه به لحاظ طبیعت کاملا متفاوت هست، توی جلسه لایو هم تاریخچه اش رو بحث کردیم.اگر یک فانکشن بتونه یک فانکشنی رو به عنوان پارامتر دریافت بکنه، یا یک فانکشن رو بتونه به عنوان برگشتی قبول کنه، یک فانکشن رو بتونیم به یک متغیری اساین کنیم بهش میگیم متد با اولویت بالا و شهروند درجه یک، اگر یه زبان برنامه نویسی چنین امکانی رو به ما بده ما میگیم یکی از چهار اصل فانکشنال رو برآورده کرده.تو پارادایم پروسیجرال ما دستورات رو به صورت کامند به سخت افزار میدیم. تو پارادایم شیگرایی دستورات رو مستقیم به آبجکت میدیم.  تو پارادایم فانکشنال دستورات رو به فانکشنها میدیم.ما توی شیگرا همیشه آبجکت رو بین دیگر کلاسها میگردونیم ولی توی فانکشنال ما فانکشن رو بین فانکشن ها میگردونیم، وقتی ما با این دید به موضوع نگاه میکنیم کلا یک دنیای دیگر باز میشه برامون و اساس و طبیعت کار نغییر میکنه.در زیر یه کدی رو میگذارم و از شما میخام با استفاده از یک فانکشن و بدون کد تکراری پیاده کنید، خواهید دید که ممکن نیست و توی شیگرا ما حتی تک وظیفه بودن رو هم تا یه جایی نمیتوینم ارضا کنیم.OOPدر کلاس بالا من هنوز اینترفیس یا ابسترکشن رو وارد کار نکردم، یه کار خیلی ساده کلی کد کپی توش هست، اگر دقت کنید تو کد بالا قسمت فور یا همون حلقه تکرار شده، هر چهار فانکشن این کد(For loop) رو کپی کردند، هر کاریم بکنیم نمیتونیم این کلاس رو با یک حلقه و کاملا تک وظیفه بنویسیم، در کد بالا تنها جایی که تغییر میکنه قسمت داخل حلقه هست که عملیات رو انجام میده ولی نمیتوینم جدا کنیم و تک وظیقه کنیم.چیزی که شیگرا به ما قول داده و مارو با چوب میزنه هر روز که باید تک وظیفه کد بزنید!! میبینیم که توی بعضی جاها خودش عاجز از ادعای خود هست و تن به کپی کردن میده، حال در نظر بگیرید این فانکشن ها هیچ ربطی به هم ندارند و فقط توی یک فایل یا کلاس نوشته شده اند، در حالی که من اینها رو از هم جدا کنم و هر کدام رو توی یک کلاس دیگری بنویسم، باز مشکلی پیش نمیاد!! در کد بالا هیچ انسجامی وجود ندارد و خیلی راحت میشه اینارو از هم جدا کرد، درستشم جدا کردن این فانکشن ها از هم هست!!! عرض کردم که نخواستم تا اون مرحله برم و کد رو به اصول کتاب شیگرایی بنویسم، تا به اینجا اکتفا کردم.همان عملیات را این بار در پارادایم فاکشنال مینوسیم، دوباره بررسی میکنیم که آیا ما تک وظیفه بودن را توانستيم ارضا کنیم؟ کد زیاد کپی پیست کردیم؟ حجم کد نوشته شده، قابل درک بودن، خوانایی کد، از همه مهم‌تر بحث پیچیدگی در یک مثال ساده رو هم به جا آوردیم؟!Functionalخوب اول از همه، کل کار در یک فانکشن نوشته شد، از کپی پیست جلوگیری شد، تک وظیفه بودن رو ارضا کرد، کد کمتری نوشته شد، از پیچیدگی های شیگرایی که مارو مجبور میکنه دور کرد، خیلی مباحث هست که در ایونت هفته گذشته برسی کردیم و اونجا به صورت ریز وارد جزییات شدیم.اولین مقاله فاکشنال رو از قصد طوفانی نوشتم تا مجبور به تفکر بشیم و موضوع رو جدی بگیریم، توی پارادایم فانکشنال همان طوری که آقای باکوس توی سال های ۶۰ میلادی صحبت می‌کند و اعتراض به تغییرات غیر قابل کنترل می‌کند، هنوز توی شیگرایی پابرجاست و به قوت خود ادامه می‌دهد، در فاکشنال ما همیشه از تغییر و نگه داشتن استیت ها دوری میکینیم، یک فانکشن تنها یک وظيفه انجام می‌دهد،کارش هیچ ساید افکتی به دیگر قسمت های اپلیکیشن ندارد، در حالی که ما توی شیگرایی هنوز دارای متغیرها و استیت هایی هستیم که توی برنامه، بارها و بارها توسط دیگر اجزا تغییر می‌کنند، زمانی که اپلیکیشن بزرگ و بزرگتر می‌شود، دیگر این کنترل از دست خارج شده و باعث بروز باگ های وحشتناکی می‌شود.من هنوز از برنامه نویسی موازی صحبت نمیکنم، بحث اسکیل پذیری رو وارد چرخه برسی نمیگم، به لحاظ اسکیل پذیری، مالتی ترد و موازی اصلا قابل مقایسه نیستن، پیچیدگی هایی که شیگرا وارد چرخه میکنه بماند در مباحث بعدی برسی کنیم، شاید خیلی ها تا الان چندین بار هیجان زده شده و نویسنده رو متهم به ندانستن و بی تجربگی در شیگرایی بکنند ولی موضوع این هست که سالهای زیادی هست با شیگرا کار میکنم و چندین پروژه اینترپرایز چه در داخل کشور چه در خارج کشور اجرا کرده و زیر بار هستند. حتی مدت زیادی هر دو پارادایم رو همزمان در پروژه ها پیاده سازی کردم ولی هر چقدر جلوتر میری و فانکشنال رو میشناسی متوجه اصولی و بهتر بودن این پارادایم میشی، مباحث زیاد هست و حتما ویدیو ایونت رو ببینید و الا نمیشه یه همچین موضوعی رو به این راحتی درک کرد مگر اینکه از ابتدا بنا رو بر قبول نکردن و گارد گرفتن در برابر تفکرات جدید بگذاریم که مسعولیتش بر عهده خواننده هست.فانکشن با اولویت بالا چیست رو برسی کنیم و این بحث رو ببنیدیم. به فانکشنی که یک فانکشن رو به عنوان پارامتر بگیرد، یا یک فانکشن رو به عنوان برگشتی تحویل دهد را فانکشن با اولویت بالا می‌گویم، در زیر چندین مدل از فانکشن های با اولویت بالا هست، با دقت برسی کرده و حتما یه مطالعه‌ در مورد فانکشن های با اولویت بالا داشته باشد و تنها به نوشته این مقاله اکتفا نکنید.Higher Order Function 1Higher Order Function 2توی ویدیو ایونت یکسری مقالات و کتاب ها آورده بودم که در آخر لینک هارو قرار میدهم.جلسه بعد در مورد Pure Function صحبت خواهیم کرد، تمامی جلسات از لینکدین و یوتوب در دسترس هست و همه جلسات به صورت لایو هستند و پرسش و پاسخ هارو مثل همیشه داریم.تا دیدار بعدی موفق باشید.https://github.com/AliMahmoodiTabrizBecoming Functional BookCMU - Prof phil koopman ve Michael BarrCan Programming Be Liberated from the von Neumann Style? A Functional Style And Its Algebra of Programs​https://wiki.c2.com/?GlobalVariablesConsideredHarmfulLinkedinویدیو ایونت فانکشنال پروگرمینگ در یوتوبویدیو انیوت فانکشنال پروگرمینگ در لینکدین</description>
                <category>Ali Mahmoodi</category>
                <author>Ali Mahmoodi</author>
                <pubDate>Tue, 19 Apr 2022 13:40:15 +0430</pubDate>
            </item>
                    <item>
                <title>طراحی در مهندسی نرم افزار - کوهیژن</title>
                <link>https://virgool.io/@ali.mahmoodi.heris/%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%AF%D8%B1-%D9%85%D9%87%D9%86%D8%AF%D8%B3%DB%8C-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%DA%A9%D9%88%D9%87%DB%8C%DA%98%D9%86-ychbdqis2eso</link>
                <description>در مقاله قبلی پیچیدگی نرم افزار رو بحث کردیم و در این مقاله انسجام رو میخواهیم برسی کنیم، این مباحث یکم سخت هست ولی در صورت درکش یه بیس تئوری قوی خواهد بود برامون پس بهتر هست چند بار مرور بشه.پیچیدگی کامپوننت، واحد اندازاه گیری انسجام، به مقدار انسجام زیر مجومعه های یک کامپوننت میگیم. انسجام یعنی برای یک وظیفه و در راستای یک هدف خدمت کردن به عبارتی تک وظیفه بودن هست انسجام یعنی هر چقدر یک کامپوننت یک کار انجام دهد همان اندازه هم انسجام بالایی دارد، تک وظیفه بودن یعنی  انسجام میخاد بگه کارهای متفاوت رو در قسمت های متفاوت انجام بده و برعکس کارهای عین هم رو در یک جا انجام بده، به عبارتی مفهوم Separation of concerns رو تعریف میکنه.کامپوننت هایی که انسجام بیشتری دارند چند ویژگی اصلی دارند.پیچیدگی پایینی دارندچون در یک جا یک کار انجام میدهیم.هزینه نگهداری پایینی دارند، چون تک وظیفه هست و یه کار انجام میده خیلی کوچک هستند و درکش راحت هست.برای استفاده مجدد مساعد هست.دلیلشم دو مورد بالا هستاز دل انسجام قانون تک وظیفه میاد بیرون، یعنی پدری که اومده قانون سولید نوشته و گفته تک وظیفه بودن یک اصل هست سرخورد ننوشته پشتش یه فلسفه قوی هست که انسجام اونو توضیح میده، باز از پایین آوردن پیچیدگی بحث میکنه کوهیژن و میگه اگر جایی که من باشم اونجا دیگه پیچیده نیست، در مقاله قبلی دیدیم که نرم افزار پیچیده هست، این اصل میگه من میتونم مشکل پیچیدگی رو تا حد زیادی حلش بکنم، توی برنامه نویسی شی گرا از قابل استفاده مجدد بحث میکنه باز کوهیژن اونم ارضا میکنه و در نهایت هزینه نگهداری و خوانا بودن که یکی از اصل های کد تمیز هست رو هم ارضا میکنه.High-cohesion Or strong-cohesionانسجام قوی یا انسجام بالا زمانی اتفاق می افتد که تمامی زیر مجموعه های یک کامپوننت اعم از کلاس ها، فانکشن ها، سطرها یک کار انجام بدهند و یک هدف داشته باشند.یک فانکشن یا کلاس هر چقدر کار کمی انجام دهد میشه گفت به همون اندازه انسجام بالایی دارد.نکته: منظور از داشتن کد کمتر در یک کلاس یا متد مفهومی هست گاها صد سطر هست گاها یک سطر هست ولی باید طوری باشد که قابل کپی پیست کردن نباشد یعنی با کپی پیست به جایی دیگه قابل انتقال نباشد.وقتی این رو به طور کامل درک کنیم متوجه میشیم میکروسرویس ها دلیل خلق شدنشون همین مورد هست و کسی که اولین بار میکروسرویس رو به دنیا معرفی کرد چیز جدیدی رو نیاورده فقط این مفهموم رو در لایه طراحی اینترپرایز پیاده کرده.Low-cohesion Or Weak-cohesionانسجام ضعیف یا پایین، در حقیقت عکس موارد بالا منجر میشه انسجام بیاد پایین، توی دنیای واقعی هم شاید شنیده باشید میگن یه چاه پر عمق بهتر از یه دریای کم عمق هست، یه تخصص رو بخون و توش ارشد شو، نه که از هر چیزی یه مقدار بدونی. وقتی ماشین کامپیوترش ایراد پیدا میکنه میبری به مکانیک میگه ببر به برق کار وقتی پیش اون میبری میگه ببر پیش کسی که از ECU سر دربیاره میخام بگم توی دنیای واقعی هم حل مشکلات به صورت درست حسابی به دست کسانی باز میشه که توی اون مورد تک وظیفه هستن.در دنیای توسعه شاید کلاس های یوتیلتی دیده باشید، به نظر من خجالت آورتر از کلاس های یوتیلتی در یک پروژه نداریم، این کلاس رو باز میکنن و همه چیز توش مینویسن و بدترش کلاس رو سراسری میکنن از همه جای پروژه در دسترس هست اینقدر توش کد و کارهای متفاوت انجام میشه که بعضا وقتی میبینم میگم یه متد main میذاشتی و پروژه رو از اینجا اجرا میکردی چه کاری هست به نوشتن لایه های دیگه، این برادر کلا شی گرا رو اشتباه متوجه شده و بویی از تک وظیفه بودن نبرده!!وقتی از واحد بودن یا وحدانیت خدا هم بحث میکنیم همینه غیر این نیست، خدا چون واحد هست منسجم هست، غیر قابل کپی هست، وحدت در کثرت یا کثرت در وحدت رو نمیخام باز کنم ولی این کانسپت کوهیژن از دل طبیعت هستی میاد بیرون چون خالق خودش واحد هست.logicalدوستان وقتی از انسجام بحث میکینم منظور انسجام از لحاظ منطقی نیست، یعنی یه کلاس خواندن درست بکن توش از فایل بخونه از دیتابیس بخونه از API بخونه!! بله خیلی گوش نواز هست ولی وقتی از انسجام صحبت میشه چنین چیزی نیست و بنده دیدم افرادی رو که این مدلی کد زدن و دلیلشونم این بوده که کار خواندن رو یک جا انجام میده خیر داری اشتباه میزنی، گرچه این کلاس فقط کارش خوندن هست ولی داره از دنیاهای مختلف ریسورس های مختلف رو میخونه و درستش اینه خواندن  فایل داخل کامپوننت فایل باشه. یه جایی میگیم کلاس برش رو بنویس و دوستمون برش لباس، مو، صدا،راه و... توی یک کلاس نوشته مگه داریم همچین چیزی آخه!! وقتی میپرسی میگه اما کارش برش هست!! دوست عزیز وقتی از انسجام بحث میکنیم باید به طبیعت  کار نگاه کنی برش صدا با برش مو یه چیزی نیست و تنها تو کلمه برش اشتراک دارند!!منظور شباهت اسمی دلیل نمیشه داخل یه کلاس باشند، گفتم که انتزاعی هست مفاهیم و باید خیلی زیاد روش وقت گذاشت و اندیشه کرد و الا کلاس برش یه روزی سرتم خواهد برید با این فرمون بری جلو!!Temporalیه جایی برنامه نویس میخاد کار موقتی انجام بده و بلوک کد رو داخل یه کنترل خطا میندازه وقتی با خطا مواجه شد یه لاگ مینویسه یا یه رفتاری انجام میده، دقت کنید این نوع اشتباه هم خیلی ظریف هست چون استدلالش اینه رفتار مربوط به این کلاس هست پس باید اینجا ارضا کنم!! ولی کنترل خطا یا نوشتن به دیتابیس یا تغیر فایل چیزی نیست که در یک جا باشند اینا کلا موجودیت های متفاوتی هستند و باید جداگانه به دست گرفته بشند و یکی باشه کارش فقط کنترل استثنا باشه و یک جا باشه همه جا کپی پیست نشه مرکزی بشه تا انسجام بره بالا. به نظر میاد این دوستمون هیچ چیزی از cross cutting concerns نمی دونه.Proceduralاشتباه بعدی هم که بیشتر دیده میشه رویه های هست یه فانکشن نوشته داخلش احراز هویت میکنه بعدش قبل احراز دیتای اومده رو ولیدیت میکنه توکن میسازه ، پسورد ریست میکنه!!! Communicational / Informationalاین مدل اشتباه هم یکم معصوم تر از دیگری هست برنامه نویس در مورد ارتباط همه چیز رو داخل یه کلاس انجام میده مثلا ارسال و دریافت داده و پردازش دیتای اومده یا کنترل Time out ها و یا ارسال دوباره یا اتصال دوباره ....Sequentialاینم که با پیشرفت کردن سینتکس های زبان های برنامه نویسی این روزها زیاد دارم میبینم به جاهایی که مشاوره میدم، خروجی یه فانکشتن رو به ورودی فانکشن دیگه میده و این تو در تویی تا چندین سطر میره وقتی میپرسم چرا اینکارو میکنی میگه میخام داخل یک سطر یه کار انجام بشه!! برادر نکن اینکارو به کی میگی به چی میگی!! احتمالا اگر سینتکس اجازه بده دوستمون کل کلاس رو تو یک سطر مینوشت و اگوش ارضا میشد، فکر میکنه اینجوری بنویسه خفنتر دیده میشه، وقتیم ایراد میگیرم به کدش شاکی میشه و فکر میکنه دارم حسادت میکنم...نکته: اگر داخل یک متد بین کد اگر فاصله میگذارید یعنی دارید داخل یک متد دوکار انجام میدین و اونجا کوهیژن پایین هست! ولی دلیل نمیشه ورودی یه کلاس رو به یه کلاس یا متد دیگه تو در تو تا انتها بدی و دلیلت این باشه میخام خط فاصله نگذارم تا کوهیژن بره بالا!!Functionalدر بین این موارد بالا از همه بهتر بابع گرا هست، تک هست خیلی خوب تعریف شده و تا جای ممکن کار کم یا وظیفه کمی انجام میده. بهترین مدل از انسجام هست.نرم افزار روز به روز در حال تغیر و بزرگ شدن هست وقتی متدهای تک وظیفه درست تعریف کنیم و بنویسیم ، درخواست های جدید تاثیری روی این متد ها نخواهد گذاشت بلکه متد های جدیدی نوشته میشه.اگر کد بالا رو بخایم بررسی  کنیم یه کلاس ایمیل نوشته برنامه نویس وقتی نگاه میکنیم خیلی ظریف و معصوم دیده میشه و تمام ها کارهای مربوط به پرینت رو یکجا داره انجام میده... در کورس کلین کد و آرشیتکت اینارو کامل بررسی میکنیم و میگیم که چیکار باید کنیم در چنین مواردی..کد بالا رو بخواهیم برسی کنیم میتونیم بپرسیم تو این سیستم فقط کاستومر لاگ اوت میکنه؟ به غیر این کس دیگه لاگ اوت نمیکنه؟!! ربطی به این کلاس نداره چرا آورده اینجا!! یا داره پسورد رو ولیدیت میکنه یا عوض میکنه! باید به ازای هر تیپ کاربر جدا جدا ریست پسورد بنویسیم؟!! اینا اشتباهاتی هست که در دنیای برنامه نویسی زیاد میبینم و این مدل کد نویسی ها کوهیژن رو به شدت میارن پایین و پیچیدگی رو میبرن بالا.این دو کلاس رو نگاه کنید، کدام کوهیژن بالایی دارد؟!! ابتدا به نظر میاد کلاس A کوهیژن بالایی دارد ولی یکم روش فکر کنیم میگیم بین سه فانکشن کلاس A هیچ اشتراکی وجود ندارد و میتونیم هر کدام رو جدا جدا در یه کلاس بنویسم یعنی کوهیژن پایینی دارد ولی کلاس B رو نمیتونی به این راحتی از هم جدا کنی و گذشته از اون تمام کارهایی گه کلاس آ انجام میده رو خود ب هم قادر به انجامش هست و سوال این میشه دلیل چرایی وجود کلاس آ چی هست؟ داخل یک فایل باشند !! این مثال یکم سخت هس درکش ولی مجبور میکنه به فکر کردن مار!! به نظر شما مشکل این کد بالا چیست؟ شاید بگید برادر شمام اذیت نکن بنده خدا کلا پنج خط کد نوشته دیگه چیکار باید بکنه تا راضی بشی؟ ولی دوستان این برنامه نویس گناهکار هست داره چندین کارو یک جا انجام میده ابتدا ولیدیشن انجام میده دوما کنترل استثنا هم میکنه سوما داره کار لاگ هم انجام میده!! اینجوری که توی عکس دیده میشه نیست این دوستان پس فردا پروژه بزرگ بشه این کلاس چند صد خط خواهد شد و بدتر اینکه از روی کانتکس رشته داره شرط برسی میکنه، این برنامه نویس رو باید.....در مقاله بعدی شروع میکنیم با برسی قوانین سولید.</description>
                <category>Ali Mahmoodi</category>
                <author>Ali Mahmoodi</author>
                <pubDate>Sun, 06 Jun 2021 17:59:24 +0430</pubDate>
            </item>
                    <item>
                <title>معماری مهندسی نرم افزار -پیچیدگی</title>
                <link>https://virgool.io/@ali.mahmoodi.heris/%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%D9%85%D9%87%D9%86%D8%AF%D8%B3%DB%8C-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D9%BE%DB%8C%DA%86%DB%8C%D8%AF%DA%AF%DB%8C-wprygj3sc0df</link>
                <description>در مقاله قبلی در مورد استفاده از ابزار فلسفه در نرم افزار صحبت کردیم و امروز میخام در مورد اساس های طراحی نرم افزار صحبت کنم. هدف ساخت یک بیس تئوری در طراحی پترن های معماری نرم افزار هست. پیچیدگی و تغییرنمیدونم مقاله No Silver Bullet آقای فردی بروک رو خوندین یا خیر، یکی از مقالاتی که از طبیعت نرم افزار بحث میکنه همینه . در دانشگاهای تراز اول نرم افزار در جهان مطلقا این مقاله رو میگن بخونید! ایشون از پدرهای دنیای نرم افزار هستند و خیلی ها به مقاله ایشون رفرنس میدن و بنده هم امروز به ایشون یکسری چیزی هارو رفرنس خواهم داد.این پدر میگه نرم افزار دارای چهار صفت اصلی هست، وقتی از کلمه اصل استفاده میکنه یعنی صفات غیر اصلی هم دارد و ما قبلا بحث کردیم در مقاله قبلی . آنچیزی که تعیین موجودیت میکنه یه صفت اصلی هست مثل تفکر کردن انسان که منحصر به فرد به انسان هست ولی داشتن دست و پا منحصر به انسان نیست چون حیوانات هم دست و پا دارند، از دید فلسفی (ارسطو) هم همینه چیزی یا رفتاری یا صفتی که فقط مربوط به اون چیز هست در حقیقت تعریف اون چیز میشه در غیر این صورت اون صفت فرعی هست. البته اسلام هم همین مفهموم رو تعریف میکنه نفس آن چیزی است که تعیین موجودیت می کند در ظاهر و باطن و نشانه اش این است که خواسته دارد(آیه 53 یوسف). در کل اگر از اون چیز موجودیت های اصلی رو  بگیریم اون چیز دیگه خودش نیست مثل گرفتن قدرت تحلیل و تفکر از انسان.پیچیدگی قابل تغییر بودنقابل دیده نشدن سازگارینرم افزار نسبت به دیگر مهندسی ها خیلی پیچیده هست چون درای حالت های خیلی زیادی هست و قابل تحلیل از هر بعد نیست حتی قابل تست هم از هر بعد نیست، نرم افزار خیلی زیاد تغییر میکنه اینو میتونید تو نرم افزارها یا سایت ها ببینید که هر ماه یا هر هفته یکسری چیزها تغییر میکنه یا یه آپشن جدیدی به نرم افزار اضافه میشه یا ورژن جدیدی ازش میاد، نرم افزار قابل دیدن نیست چون انتزاعی هست و مورد آخر نرم افزار نسبت به شرایط موجود سازگار هست و قابلیت سازگاری بالایی دارد.نرم افزار قابل دیدن نیست چون انتزاعی هست مثل هنر، من وقتی میگم باید کلاس شما قابل استفاده مجدد باشه دارم از یه مفهوم صحبت میکنم که قابل دیدن نیست و فکری هست و چیزهای فکری معمولا قابل دیدن نیستن . وقتی از دید فلسفی این 4 مورد رو نگاه میکنی  قابل دیده نبودن و سازاگاری بالا داشتن رو کنار بگذاریم چیز زیادی نمی مونه ازش چون قابل دیده نبودنش مربوط به پیچیده بودنش هست، یعنی نرم افزار یه چیز فیزیکی نیست و چیزی که فیزیکی نباشد درکش سخت هست و قابل دیدن نیست. سازگاری هم باز از دل قابل تغییر بودن میاد بیرون و توی دستمون دوتا صفت اصلی میمونه: پیچیدگی و تغییر پیچیدگی و زیاد قابل تغییر بودن نرم افزارشاید تا الان متوجه شده باشید چرا دارم از این موراد بحث میکنم، چون پترن های معماری یا دیزاین پترن ها یه هدف دارن : پیچیدگی رو بیارن پایین و تغییر پذیر بودنش رو ارضا کنند.پیچیدگی چون نرم افزار یه چیز انتزاعی هست و قابل دیدن نیست و فکری هست پیچیده هست، هر چیزی که چنین صفاتی رو داشته باشه پیچیده هست و تنها نرم افزار نیست . وقتی میگیم انتزاعی هست یعنی محدودیت های فیزیکی ندارد و این کارو سخت میکنه . در یک سیستم 64 بیتی 2 به توان 64 حالت وجود دارد. توی یک کانتکست یه متغیر عدد هست توی کانتکست دیگه یه رشته هست و نسبت به اون باید رفتارهایی رو توسعه بدی، وقتی داخل یک رشته نام محصول رو مینویسی باید کنترل کنی، چون رشته محدودیت نداره میتونه داخلش میلیاردها کلمه دیگه بیاد و نام محصول با عدد یکی نیست پس باید کنترل بشه و این میخاد بگه نرم افزار پیچیده هست، مثل ماشین نیست که بری لاستیک تریلر رو بیاری و بخای بندازی روی پراید، اصلا اجازه نمیده ولی توی مهندسی نرم افزار محدودیت وجود نداره و چنین اجازه ای برا اثر طراحی اشتباه ممکن هست، حین اجرا شدن میبینی اشتباه کردی چون قابل دیدن نیست... در چرخه حیات نرم افزار راحترین قسمتش کد نویسی و توسعه هست، چون تنها جایی که نرم افزار قابل لمس هست قسمت توسعه هست، کد نویس با کامپایلر سروکار داره و کامپایلر قوانین سفت سختی رو میگذاره، یا وقتی آنالیست یه قسمتی رو میگه بنویس برنامه نویس حین نوشتن متوجه میشه else شرط آنالیز نشده و همون لحظه میتونه ببینه چیزی که آنالیست ندیده، آنالیست با انسان ها سروکار داره و کاربر هر چیزی رو میتونه بخاد و قسمت آنالیز چرخه نرم افزار خیلی خیلی سختر هم هست. وقتی میگیم نرم افزار رو باید بزرگ کنیم چون جواب درخواست های مارو نمیده مثل لپ تاپ نیست که بری رمش رو زیادی کنی یا هاردش رو زیاد کنی تا بزرگ بشه!!! نرم افزار این مدلی بزرگ نمیشه نمیتونی بیای داخل یک کلاس دو سه تا ایف دیگه بنویسی و بگی بزرگش کردم یا بیای از اون کلاس چنتا کپی کنی بگی بزرگش کردم، توی نرم افزر کلا جاهایی که مشابه هستن رو ما یکیش میکنیم، اگر بخایم نرم افزار رو بزرگ کنیم، یا یه سرویس جدید خلق میکنیم، یا یه کامپوننت جدیدی که در سیستم نیست رو خلق میکنیم ....نکته :وقتی از پیچیدگی صحبت میکنیم منظور پیچیدگی الگوریتمی نیست، منظور پیچیدگی ساختاری و رفتاری هست، هزاران آبجکت داریم و اینا باید باهم در ارتباط باشند ما باید طوری این ارتباط رو بچینیم که حالت بهینه داشته باشه نه که هر آبجکتی در ارتباط با دیگر آبجکت ها باشه, باید راه حلی پیدا کنیم که با کمترین ارتباط آبجکت ها بتونن کار کنند.Robert E. Wood, 1986 &quot;Task Complexity: Definition of The Construct&quot;آقای وود مهندس صنعت هستند، در یه مقاله در مورد پیچیدگی کارها نوشته که خیلی از رشته های مهندسی مختلف بهش رفرنس میدن و بنده هم در این مقاله بهش رفرنس میدم. در دنیای مهندسی مدل ایشون میگیرن و بر اساس این مدل تعریف شده پیچیدگی یک کارو در میارن، ما هم میخاییم از روی تعریف آقای وود پیچیدگی نرم افزار رو ببینیم.این پدر میگه که پیچیدگی کار رو میشه به سه قسمت تقسیم کرد.پیچیدگی تسک ها هر چقدر زیاد باشد به همان اندازه هم محصول نهایی پیچیده هست، پیچیدگی مراحل ساخت یه کفش با بمب اتم یکی نیست چون محصول نهایی که بشه کفش خیلی چیز ساده ای نسبت به بمب اتم هست.پیچیدگی قسمت های مجزای یک سیستم مثلا توی مثال کفش پیچیدگی قسمت قالب گیری و یا دوختن در پیچیدگی محصول نهایی تاثیر مستقیم دارد.ورودی های مورد نیاز برای به اتمام رسیدن این کارها و رفتارهای اتمیک، هر چقدر ورودی های قسمت های اتمیک مراحل ساخت زیاد باشد به همان اندازه خود اون زیر مجموعه های اتمیک پیچیده هست. مثلا برای دوختن کفش ورودی نخ هست حالا این ورودی ها هر چقدر پیچیده باشند خود اون قسمت مجزا هم پیچیده تر میشه و هر چقدر هم این قسمت های مجزا پیچیده تر باشند محصول نهایی پیچیده تر میشه.حالا در دنیای نرم افزار اگر بخاییم این مدل رو بررسی کنیم میتونیم در یه سیستم فروشگاه اینترنتی بگیم که کل سیستم اعم از قسمت (کیف پول، سبد خرید، جستجوها) محصول نهایی هست که بهش میگیم سیستم فروشگاه آنلاین و اجزای اتمیک این میشه قسمت جستجو که باز خودش میتونه داخلش اجزای اتمیک داشته باشه مثل گرفتن دیتا  و گرفتن دیتا نیاز به ورودی داره که همون فیلترها هستن.محصول : فروشگاه اینترنتیاجزای اتمیک این محصول: کیف پول - جستجوی محصولورودی ها: دادن پارامترهای فیلتر مثل محصولاتی که قیمتش اینقدر باشه.حالا وقتی بتونیم پیچیدگی تمام وظایف در پیچیدگی اجزای اتمیک ها در ورودی هاش حساب کنیم میشه پیچیدگی محصول نهایی . وقتی به این مدل فروشگاه آنلاین نگاه میکنیم تنها قسمت ورودی های جستجو دارای چند صد پارامتر هست مثل جستجو بر اساس نام، قیمت و... این مدل هم اثبات میکنه ذات نرم افزار پیچیده هست.Static Complexity and Coordinative Complexityپیچیدگی جداول و پیچیدگی توابع و پیچیدگی کلاس ها در پیچیدگی ورودی های تک تک این اجزا رو میگیم پیچیدگی کامپوننت. تازه این قسمت استاتیک موضوع هست، یه پیچیدگی هم نحوه ارتباط این اجزا باهم هست که  سختی کار این هست که بهش میگیم پیچیدگی هماهنگی یا کوردیناتیودر مقاله بعدی کوهیژن یا همان انسجام رو به دست میگیرم و بحث پیچیدگی و انسجام چه ربطی به هم دارند رو بررسی میکنیم تا ببینیم چوری میتونیم این پیچیدگی رو بیاریم پایین تا قابل تغییر به راحتی باشد.</description>
                <category>Ali Mahmoodi</category>
                <author>Ali Mahmoodi</author>
                <pubDate>Sun, 06 Jun 2021 02:17:05 +0430</pubDate>
            </item>
                    <item>
                <title>بدون فلسفه امکان توسعه نرم افزار درست ممکن نیست.</title>
                <link>https://virgool.io/@ali.mahmoodi.heris/%D8%A8%D8%AF%D9%88%D9%86-%D9%81%D9%84%D8%B3%D9%81%D9%87-%D8%A7%D9%85%DA%A9%D8%A7%D9%86-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D8%AF%D8%B1%D8%B3%D8%AA-%D9%85%D9%85%DA%A9%D9%86-%D9%86%DB%8C%D8%B3%D8%AA-r1zoniqsiwc3</link>
                <description>شاید بارها شنیده باشید برنامه نویس باید ریاضی بداند یا خوب بلد باشد، در حقیقت از نظر بنده این اصل اشتباهی هست، شاید خیلی از متخصصین به این جمله حمله بکنند شایدم خیلی ها هیجان زده شده موافق این باشند ولی هدف این مقاله به دور از تعصبات و باورها بررسی نرم افزار در چارچوب فلسفه هست.ما در دنیای واقعی مشکلات رو خیلی زود میتونیم  تشخیص بدیم. حین سفر اتو رو با خودم میبرم اروپا، رسیدم و میخام بعد استراحت لباسم رو اتو کنم، اتو کار نکرد چون اروپا با 110 ولت کار میکند و دستگاه من نیاز به 220 ولت دارد، مشکل رو خیلی زود متوجه شده و یک آداپتور تهیه میکنم و ازش استفاده میکنم. در دنیای توسعه درک این مشکل و حلش سالها زمان نیاز دارد چون مشکلات رو نمیتونیم ببینیم. این یعنی جنس کار توسعه نرم افزار کلا انتزاعی هست و همیشه درک انتزاع سخت هست و برای درک انتزاع همیشه مجبور هستیم چندین و چندین مثال بیاریم تا بتونیم مطلب رو منتقل کنیم.برای درک مشکل اتو ما نیاز به ریاضی نداریم، برای درک این مشکل نیاز به منطق داریم، هومم یعنی میخای بگی که توسعه دهنده باید منطق رو خوب بلد باشه؟ دقیقا درستهآنچیزی که در قالب منطق باشد میتوان در فلسفه در موردش صحبت کرد!! اینجا آورده فلسفه این هست، ما چیزهایی را که مجسم نیست را میتوانیم در فلسفه اثبات و درک کنیم تا بتوانیم راه یا تصمیم درست رو بگیریم.منطق تغییر نمیکند پس فلسفه ثابت هست! مربع در این دنیاهم مربع هست در مریخ هم مربع هست چون داریم از ذات یک موجودیت بحث میکنیم.در دنیای توسعه اگر دقت کنید معماری های مختلفی وجود دارد ولی همه دنبال حل یک مشکل هستند. کاهش وابستگی و افزایش انسجام.کاهش وابستگی و افزایش انسجام کاملا انتزاعی هست و اینجا ریاضی، تیز هوشی و.. کار نمیکنه، اینجا باید فلسفه این موضوعات رو درک کنیم تا بتوانیم حین توسعه اندازه گیری کنیم. همانطور که خط کش یا واحد اندازه گیری اسلام تقوا هست توی نرم افزارم هم باید خط کش رو پیدا کنیم، به همین دلیل از همان ابتدای شروع دنیای برنامه نویسی افراد زیادی سعی کردن یکسری واحد ها تعریف بکنند ولی اگر دقت کنید قابل درک به راحتی نیستن چون انتزاعی هستن، چون فلسفه رو در این موارد کنار گذاشتیم و میخاییم یه موضع انتزاعی رو بدون ابزار درک کنیم. یکسری افراد با کسب تجربه چندین ساله آروم آروم متوجه میشوند که چه چیزهایی رو باید توی نرم افزار در نظر بگیرند یا نگیرند در حالی که اگر از همان ابتدا فلسفه موضوع رو درک میکردن اینقدر هزینه نمیدادن.هومم! یعنی اگر ما به صورت فلسفی بتونیم معماری و برنامه نویسی رو درک کنیم، میتونیم بدون پرداخت هزینه های زیاد به صراط مستقیم هدایت بشیم!! از نظر من بله، چون وقتی شما مفهوم وابستگی رو درک کنید دنبال راه چاره خواهید بود، ببینید چی دارم میگم &quot;وقتی مفهموم رو درک کنید&quot; یعنی مشکل رو متوجه شدی، خیلی خیلی مهمه درک مشکل اگر تو موضوع اتو مشکل رو درک نمیکردم نمیتونستم ازش استفاده کنم و مجبور بودم اتو نو  تهیه کنم.از نظر بنده درک مشکل از همه مهمتر هست، چون برای درک مشکل شما نیاز دارید تفکر کنید، کسانی که می اندیشند با کسانی که نمی اندیشند قطعا برابر نیستن! اینجا فلسفه به ما کمک میکنه به موضوع بله یا خیر بگیم، اینو جلوتر باز خواهم کرد.رسیدم به جایی که مشکلات رو میدونیم، یعنی میدونیم  حین طراحی و توسعه باید یکسری پارامترهارو رعایت بکنیم  تا هزینه ندیم، ولی برای حل  مشکلات راه حل میخاد اینجام یکسری قوانین میاد وسط و خود این قوانین هم باید به لحاظ منطقی و فلسفی درک شوند، مثلا قوانین سالید یا گرسپ اومدن یکسری اصل تعریف کردن، مثل اصل تک وظیفه بودن، خوب اگر نتوانید این موضوع رو به صورت فلسفی اثبات کنید و نتوانید رابطه این اصل تک وظیفه رو با کاهش وابستگی و افزایش انسجام پیدا کنید یعنی درکش نکردید فقط یه مثالی زدن تو هم در حد اون مثال درکش کردی وقتی میخای پیاده کنی میبینی مثال ایشون مورد استفاده شما نیست!!! تو مصاحبه میپرسن سالید رو تعریف بکن، طرفم شروع میکنه ورورورورورورو جواب میده، برادر داری اشتباه میزنی چون تعریف یه چیز یه موضوع هست، درکش یه موضوع دیگه، به همین خاطر بعد استخدام میبینی یارو کلا مخالف سالید کد میزنه، بله این کارا اینجوری که دیده میشه نیست.وقتی اصل تک وظیفه رو نگاه میکنیم، اونجوری که نوشته شده یا نشون میده نیست یعنی نوشتارش با خواندنش یه چیز نیست باید بشینی موضوع رو از بعد فلسفی بررسی کنی.یکم میخام بازتر کنم موضوع رو. طرف میاد اصل تک وظیفه رو میخونه بعدش وارد دنیای توسعه میشه و شروع میکنه یه کلاس پرینت مینویسه که داخلش دیتا رو پرینت میکنه ذخیره میکنه حتی لاگ میکنه حتی مدیریت استثنا میکنه، از دید این شخص این کلاس تک وظیفه هست و کارهایه مربوط به پرینت رو میکنه از دید ایشون خیلی منطقی هست ولی دلیل این اشتباه مهلک عدم درک انسجام و پیچیدگی و وابستگی هست .اینم بگم برنامه نویسی که با چنین منطقی کد میزنه خطرناکتر از داعش هست. جرات داری بهش بگو بالا چشت ابرو هست، بله دوستان میخام بگم باید با دید فلسفی نزدیک بشیم و بعد درکش استفاده کنیم.جمله &quot;خوب اینم که کار میکنه چرا باید اسم هارو صحیح بنویسم یا ...&quot; اینو من باز نکنم چون ذاتا آدم بد دهنی هستم چیزی نگم چون مجبورم میشم صفحه رو ببندم برم.کسی که درک فلسفی از تک وظیفه بودن نداشته باشه فکر میکنه باید یه کلاس تک وظیفه باشد ولی وقتی درک درست باشد میگه یه سطر کد باید تک وظیفه باشد بالاتر یه فانکشن بالاترش کلاس بالاترش پکیج بالاترش خود اپلیکیشن، اگر سوالت اینه یه اپلیکشن چطوری میتونه تک وظیفه باشه یعنی درک درست نداری از تک وظیفه بودن. وقتی این مفاهیم رو از بعد فلسفی تحلیل میکنی میگی میکروسرویس چیز جدیدی نیست که چون داره اصل تک وظیفه رو ارضا میکنه!!! هومم ببین گفتیم منطق ثابت هست و تغیر نمیکنه این برداشت های اشتباه ماست که موضوع رو تغیر میده.اصل تک وظیفه و انسجام بیشتر، در معماری به شما میگه مدیریت خطا یه موجودیت عمومی هست یا لاگ گیری یه موجودیت عمومی هست و باید اینارو یکجا آنجام بدی نه که هر کلاسی یا بلوک کدی، بیاد از کنترل استثنا استفاده بکنه، میای میرسی به لایه اپلیکیشن و آسپکت ها و کراس کاتینگ کونسورن ها!! چیزی که معماری دامین ازش بحث میکنه!! ولی اینم چیز جدیدی نیست فقط موضوع انتزاعی رو آورده مجسم کرده وقتی میبینی میگی آره خیلی کار خفنی هست! حالا اینم یه چیزیه، چون خیلی ها مفهوم لایه اپلیکیشن و دامین رو نمیدونن و ماستارو میریزن تو قیمه!! اگر دنبال ساخت یه چیز مهندسی شده باشیم در دنیای نرم افزار باید به صورت فلسفی قوانین رو درک کنیم  مشکلات رو درک کنیم بعدش میتونیم راه حل هارو بررسی کنیم ولی راه حل هایی که قرار هست بهش برسیم یکی هست چون صراط مستقیم یکی هست.مختصری از راه حل ها بحث کنم! خود اینم باز انتزاعی هست یه جایی راه حل در سطح معماری مورد بحث هست که پترنهای معماری رو بررسی میکنیم یه جایی در سطح کد هست دیزاین پترن هارو بررسی میکنیم ولی حتی اگر راه حلهای عمومی که درجهان تا به امروز پیشنهاد شده رو ندونید یا استفاده نکنید ولی چون درک درست دارید به جایی که میرسید همین پترنها هستن. شما یه جایی آبجکت هایی دارید که باید از هم دیگه استفاده بکنند و این باعث افزایش پیچیدگی میشه و این یه مشکل هست باید حلش کنی میای از پترن مدیتور استفاده میکنی یا آبزرور ... حالا اگر این پترن هارو ندونی و بخای حلش کنی در نهایت یه همچین پترنی رو خود به خود بهش میرسی. پترن فساد رو تعریف کنید باز شروع میکنه ورورورورورور !!! اگر ندونی مشکل رو هیچ وقت پترن رو نمیتونی استفاده کنی و اگر مشکل درک بشه فلسفه پشتش درک نشه باز نمیشه!!! چی گفتیم؟ کلی آبجکت هست باید از هم باخبر باشند!! مشکل جلو چشت هست اینجا پیچیدگی بالاست و باید رفعش کنی، وابستگی رو بیاری پایین، ولی بدون درک کوهیژن مشکل رو نمیتونی ببینی و آش درست میکنی برادر. در صورت درک صحیح، سریع میای دنبال پترن هایی که وابستگی رو کاهش میدن مثل مدیتور و استفاده میکنی، بیشتر برنامه نویس ها پترن هارو بارها خوندن ولی چیزی ازش متوجه نشدن، پترن آداپتور ورورورورورورورو خوب فهمیدم ولی کجا باید استفاده کنم!!! برادر پترن اومده مشکلی رو حل بکنه ، شما مشکل رو درک نکردی که بخای راه حلش رو درک کنی. یعنی میخاد دوستمون از راه حل به مشکل برسه از مشکل به منطق برسه و بعدش فلسفش رو درک کنه!!! بله میشه و نود درصد برنامه نویس ها همین کارو می‌کنن  ولی بعد از تجربه چندین ساله و دادن هزینه های سنگین، چندین سال با کدهاشون اینو اونو کور میکنن بعدش میفهمن داستان چیه اونم همش رو نه کمی تا نیمه ابری.توی فلسفه از جز به کل میشه رسید و از کل هم به جز میشه رسید ولی اولی خیلی سخته، به علامه طباطبایی میگن ایشون از جز میتونن به کل برسند جواب میده مزاح میکنن!!! مثل این میمونه بهتون فرمان رو بدم و بعدش سوال کنم چه مشکلی رو از چه چیزی حل میکنه؟!!برای شروع میشه از این جمله پایین شروع کرد به نظرم.آنچیزی که تعیین  موجودیت میکند نفس سیستم هست.در تعریف موجودیت انسان، انسان دوتا پا دارد تعیین موجودیت نمیکنه چون کلی حیوان هم دوتا پا دارد!! یک پروژه رو آن چیزی که تعیین  موجودیت میکند، باید آنها را در برنامه توسعه قرار داد و الا خاسته های  نفس قابل ارضا نخواهد بود. موجودیت هارا باید درست بشناسیم و آنچیزی که تعیین  موجودیت میکنه رو پیاده سازی کنیم. قانون همه یا هیچ در تعیین موجودیت صادق هست.سوال : در یک سیستم بانکی آیا تماس با مشتری یا ارسال پیامک تعیین موجودیت میکند؟در صورت درک منطق این نوشته، ذات میکروسرویس قابل هضم خواهد بود.در مقالات بعدی شاید بتونم دونه دونه قوانین&quot; سالید،گرسپ،دیزاین پترن ها ، پترن های معماری&quot;  رو به لحاظ فلسفی باز کنم در این مقاله فقط خواستم به مهم بودن فلسفه در توسعه نرم افزار بپردازم.</description>
                <category>Ali Mahmoodi</category>
                <author>Ali Mahmoodi</author>
                <pubDate>Wed, 19 May 2021 16:07:36 +0430</pubDate>
            </item>
                    <item>
                <title>برنامه نویسی آسپکت گرا</title>
                <link>https://virgool.io/fboard/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A2%D8%B3%D9%BE%DA%A9%D8%AA-%DA%AF%D8%B1%D8%A7-oe9q7ynjmimg</link>
                <description> https://www.youtube.com/watch?v=4RRQd-1nkeU&amp;t=42s در دنیای برنامه نویسی تکتیک های زیادی هست یکی از این هم همین بحث Cross-cutting concern می باشد.قبل اینکه وارد موضع بشیم ابتدا مفهوم نگرانی های مشترک رو برسی کنیم، نگرانی را باید به صورت انتزاعی بشناسیم،نگرانی بخشی از یک سیستم است که بر اساس عملکرد تقسیم میشود، این میتواند به اندازه جزییات تعامل با پایگاه داده کلی باشد و یا میتواند در حد یه محاسبات ابتدایی باشد، در کل میتوانیم بخشهای منطقی کد را تفکیک کنیم و نگرانی های هر قسمت رو به صورت جداگانه برطرف کنیم.نگرانی ها یا ریسک ها یا مشکلات یا نمیدونم چجوری معنیش کنم به دو نوع یعنی نگرانی های اصلی و نگرانی های مقطعی میتوان دسته بندی کرد، به طور خلاصه نگرانی های مقطعی در بین چندین ماژول همپوشانی و اشتراک دارند و ویژگی های ثانویه رو نشان میدهند به عنوان مثال ورود به سیستم ، امنیت، ارسال دیتا... نگرانی و ریسک هایی هست که در هر ماژول یا برنامه موجود هست و به همین دلیل نگرانی های یک سیستم نامیده میشوند.نگرانی های اصلی نمایانگر عملکرد واحد و خاص برای نیازهای اولیه هست، مانند لاجیک بیزینس.احتیاج های مشترک در سیستم بانکیدر شکل بالا ما سه نگرانی اصلی داریم مانند مدیریت مشتری ها، سپرده نقدی و برداشت نقدی که اینا احتیاج های اصلی در یک سیستم بانکی می باشند ، ما بانک رو مثال زدیم ولی میدونید که موضوع کاملا انتزاعی هست که ما خواستیم در این مثال این انتزاع رو در سیستم بانکی تحلیل و برسی کنیم... ولی سه تا هم مشکل مشترکی بین نگرانی های اصلی هستن مثل نگرانی احراز هویت, لاگیری, امنیت.به نظر تا اینجا متوجه شدیم نگرانی های اصلی چیست و نگرانی ها مشترک چیست حال با درک این موضوع میریم به سمت برنامه نویسی آسپکت گرا و میخواهیم برای مشکلاتی که بین دیگر ماژول ها همپوشانی دارند رو یک بار بنویسیم و در طی برنامه ازش استفاده کنیم و بنده این قسمت میخواهم در زبان دات نت گور پیاده سازیش بکنم.فکر میکنم یکی از بهترین مثال ها برای Cross-cutting concern کارهایی هس که عملکرد تراکنشی انجام میدهند، ما برای تمام متدها و یا سرویس ها نیاز داریم try-catch بنویسیم تا کامیت و یا رولبک انجام دهد، با استفاده از یک انوتیشن برای متد مورد نظر با کمک مفهموم برنامه نویسی آسپکت گرا, هم یک معماری کلین هم کپسوله سازی را انجام دهیم. یعنی فقط با یک انوتیشن ساده اون فانکشن رفتار ترنزاکشنال رو انجام خواهد داد و این یک دست آورد خیلی بزرگی هست... به فانکشن و انوایشن زیر دقت کنیدبه 6 خط اول که از انوتیشن استفاده شده دقت کنید.به سه خط اول که از انوتیشن استفاده شده دقت کنید.در این متد یک پانل رو باید اضافه بکنه به دیتابیس اولا باید این کارو لاگ بکنه تا پس فردا مشکلی پیش اومد بتونیم پیگیری کنیم دوما بحث امنیتش هس که هر کاربری امکان اضافه کردن ندارد به غیر از ادمین و سوما باید دیتای داخل پنل درست باشد. و یا در فانکشن قبلی اگر دقت کنید کش 60 ثانیه و یا آسپکت ترزاکشن و... همانطور که مشاهده میکنید این نگرانی ها بین دیگر نگرانی های اصلی سیستم مشترک هس. اگر بخواهیم داخل متد اینارو بنوسیسم چه بلبشوری میشه و بدتر اینکه دیگر قسمت های سیستم هم همین نگرانی رو دارند و باید برای تک تکشون این کارهارو انجام بدیم که از دید معماری تمیز و کد نویسی تمیز کار درستی نیست پس باید وارد مفهوم آسپکت گرا بشیم. به دلیل اینکه پیاده سازی این موضوع در قالب مقاله سخت هست نوشتنش طی هفته های آینده یه فیلم اموزشی سری در این مقاله اضافه خواهم کرد. </description>
                <category>Ali Mahmoodi</category>
                <author>Ali Mahmoodi</author>
                <pubDate>Mon, 01 Mar 2021 20:57:20 +0330</pubDate>
            </item>
                    <item>
                <title>شرایط کار و زندگی در ترکیه</title>
                <link>https://virgool.io/@ali.mahmoodi.heris/%D8%B4%D8%B1%D8%A7%DB%8C%D8%B7-%DA%A9%D8%A7%D8%B1-%D9%88-%D8%B2%D9%86%D8%AF%DA%AF%DB%8C-%D8%AF%D8%B1-%D8%AA%D8%B1%DA%A9%DB%8C%D9%87-fw5fwq1i7xz2</link>
                <description>سلام .همه دوستان چند وقتی هست در مورد شرایط کار ترکیه و مهاجرت به ترکیه سوالاتی میکنن این شد که در یک مقاله به تمام سوالاتی که میشه رو جواب بدم.ابتدا از فرهنگ ترکیه مختصری مینویسم. ترکیه یه کشور سکولار هست یعنی آزادی دین، توی شناسنامه شما دینتون نوشته نمیشه ولی چون نود درصد مسلمان هستن برای ملتش یک ارزش خیلی مهمی هست مسلمان بودن ولی در  سطح سیاست بهش کسی گیر نمیده هر چند از دین استفاده ابزاری میشه مثل بیشتر کشورهای مسلمان... همان طور که در کشور ما دین بازار داغی داره در ترکیه هم بازارش رونق داره و ملت ترکیه خیلی حساس هستن به دین و معمولا به حلال و حرام مقید هستن، برعکس چیزی که از داخل ایران نسب به ترکیه دیده میشه، کشور مذهبی هستن برای مثال در روز جمعه همه در نماز جماعت حاضر میشن و هنوزم درک نکردم چرا... تورک ها از آسیای  دور تا قلب اروپا درای یک فرهنگ و زبان هستن و فرقی بین تورک ایغور و تورک مجار وجود نداره چون از یک ریشه و فرهنگ هستند و یکسری از تورک ها معتقد به ملتچی(ناسیونالیسم) بودن هستن(ناسیوتالیسم رو با نژادپرستی قاطی نکنیم) یکسری مسلمان بودن که هر کدام پارتی مخصوص خود را  در مجلس کبیر ترکیه دارن حتی کوردها هم پارتی مخصوص خود را دارند ... چرا اینارو میگم چون خیلی مهم هست وقتی میخای صحبت کنی یا مصاحبه کنی بدونی داری چی میگی.. یکی از مهمترین چیزها بحث فاشیستی هست و باید عرض کنم در ترکیه خیلی کم رنگ هست ولی هست... بیش 5 ملیون سوری اینجا زندگی میکنن ولی ملتش زیاد بهشون فاشیستی نمیکنن یه چیز رو خط قرمز اعلام کنم تا زمانی که به ملت تورک(بین تمام تورک های جهان صادق هست) و دین اسلام و پرچم ترکیه کاری نداشته باشی اونام کاری باهات ندارن ...فکر کنم تا اینجاش تونستم توضیحی داده باشم...وضعیت زندگی در ترکیه چگونه هست؟یکی از مهمترین سوالاتی هست که باید بهش پرداخته بشه.. حقوق کارگری در ترکیه برای سال میلادی 2021 سه هزار لیر هست و با این مبلغ در شهرهای مهم ترکیه از گشنگی میمیری یعنی عین حقوق کارگری ما که حقوق به حساب نمیاد... یه چیزی رو خیلی واضح باید بگم... اینجا نسبی میرم جلو تا شما راحتر حساب کنید قدرت یک لیر ترکیه رو باز کنم من با یک لیر نمیتوانم سوار اتوبوس بشم نمیتونم سوار مترو بشم(سه لیر هست اتوبوس یا مترو) در حالی که با هزار تومن ایران میتونم سوار مترو یا اتوبوس بشم یعنی هزار تومن ایران در ایران خیلی قدرتمند تر از یک لیر ترکیه در ترکیه هست... تاکسی خیلی گرون هست و یه مسیر 10 کیلومتر 40 لیر با این حال من برابر میکنم قدرتهاش رو یعنی کسی که ایران 5 میلیون حقوق میگیره  رو برابر میکنم با 5 هزار لیر حقوق در ترکیه حال حساب کنید شما با 5 میلیون در ایران چه استاندارد زندگی داری همون استاندارد رو با پنچ هزار لیر در ترکیه میتونی داشته باشی ولی یکم پایینتر... نکته های مهمی رو باید بازگو کنم ما یک کشور خیلی ثروتمندی هستیم و ترکیه یک کشور خیلی فقیر شاید یکسری بگن یعنی چی ما اگر ثروتمندیم چرا از گشنگی میمیریم اونجاش رو من بررسی نمیکنم یعنی در حدش نیستم ما در سطح بین الملل صحبت میکنیم... ثروتمندی یک کشور در کجا نمود پیدا میکنه؟ من وقتی وارد یه پارک جنگلی در ایران میشم هیچ احدی از من تقاضای پول نمیکنه ولی در ترکیه پارک های جنگلی ورودی 30 لیر دارن یا من در داخل شهر تمام اتوبان هارو استفاده میکنم پل هارو استفاده میکنم یک ریال هم پرداخت نمیکنم در حالی که در ترکیه شما با ماشین شخصی وارد اتوبان بشی 5 لیر برای 10 کیلومتر باید بدی یا پل استفاده کنی از 10 لیر تا 170 لیر باید پراخت کنی برای یه پل 2 کیلومتری اینجاست که میفهمی ثروتمندی یک کشور یعنی چی ...ماشین که میخری پول دوتا ماشین پرداخت میکنی مثلا یه ماشین 100 هزار لیری میخری بعدش 100 هزار لیرم باید به دولت پرداخت کنی تا اجازه حرکت داخل کشور رو داشته باشی و کار اینجا تموم نمیشه سالانه دوبار باید مالیات نسبت به حجم موتور میدی من هر شیش ماه 500 لیر به حساب دولت واریز میکنم علاوه بر پول جاده و پل ها که اونو همون لحظه که از اتوبان خارج شدی از حسابت کسر میکنه در حالی که ما در ایران برای اتوبان های بین شهری یه مبلغ جزئی پرداخت میکنم که من از تبریز تا تهران 50 هزار تومن میدم اینجا همین مسافت رو برم 500 لیر باید بدم ناقابل.. من چرا بازگو میکنم آیا قصد ترساندن شمارو دارم، قطعا دارم چون باید بدونی جایی که میری توش چه چرخه ای حاکم هست، ادامه میدم، من برای قبوضم سر ماه حدود هزار لیر پرداخت میکنم اینجا انرژی خیلی گرون هست در حالی که بنده چه در تهران چه در تبریز کل قبوضم میشد صد تومن . بالا گفته بودم برابر میکنیم یک لیر ترکیه رو با یک هزار تومن ایران اینجا میبینی بعضی جاها هزار تومن ایران تا ده برابر یک لیر ارزش پیدا میکنه ...اجاره یه خونه 70 متری دو خوابه در یه جای معمولی استانبول 1500 لیر هست هزینه اجاره در تهران برای همین خونه حدود یک و نیم میلیون هست حالا شاید یکم بیشتر باشه ولی شما در ایران یه مبلغ پیش هم میدی که در ترکیه نمیدی این به اون در یعنی هزینه اجاره ایران و ترکیه رو  برابر در نظر گرفتم.. برگردیم به هزینه آشپز خونه هر ماه حدود 1800 لیر بنده هزینه آشپزخونه برای دونفر رو میدم در تهرانم نمیدونم برای دو نفر هزینه آشپزخونه چقدر باشه شاید ایرانم یک ملیون هشتصد باشه که برابر با ترکیه هس و اما بنزین که اینجا هفت لیر هست ایران سه هزارتومن اینجام میبینی که هزار تومن ایران دوبرابر لیر قدرت داره... در ضمن در ترکیه هر چیزی که بخای بخری 18 درصدش مالیات هست و باید پرداخت کنی و تمام حقوق ها در تمام رنج ها مالیات سنگینی داره در مورد بیمه درمانی دولتی هم مثل ایران هست خیلی داروهارو بیمه نمیده  و وقتی با بیمه دولتی وارد بیمارستان دولتی میشی زیاد بهت وقت نمیذارن یعنی باید بری خصوصی مثل ایران و هزینه زایمان در یک بیمارستان خصوص در ایران حدود 15 میلیون هست تو ترکیه هم بیست هزار لیر، هزینه ویزیت دکتر متخصص کودک 250 لیر هست در ایرانم فکر کنم 100 تومن باشه نمیدونم خودتون حساب کنید.. همه اینا بر اساس واقعیت هست هیچ اغراقی توش نیست وقتی اینجوری حساب میکنی اینو میفهمی هفت میلیون ایران درامد داشته باشم و هفت هزار در ترکیه فرقی نخواهد داشت متاسفانه دوستان ضرب میکنن و میگن هفت هزار لیر میشه بیست و یک میلیون ولی نمیدونن که اینجا قدرت خرید یک لیر خیلی پایین هست... نکته  آخر رو بگم جمعش کنم این قسمت رو ترکیه امروز 5 سال پیش ایران هست از لحاظ راحتی زندگی و چیزی که ترکیه رو متمایز میکنه همراه با سختی زندگیش وجود کار و ارزش دادن به مهندسین هست همین..چگونه در ترکیه میتونم کار پیدا کنم یا قوانین کار کردن در ترکیه...مثل همه کشورها ترکیه هم دارای ویزاهای متعددی هست یکی از این ویزاها ویزای کار هست و هر خارجی که بخواهد در ترکیه کار بکند باید اجازه کار در این کشو رو داشته باشه در غیر این صورت این شخص به صورت غیر قانونی داره کار میکنه که بهش بیمه و.. تعلق نمیگیره و اگر دولت متوجه بشه جریمه سنگینی به کارفرما و شخص مینویسه. پس اگر قرار هست در ترکیه کار کنیم بهتر هست ویزای کار داشته باشیم و ترکیه قوانین سختی رو برای دادن ویزای کاری داره اولا شرکت باید هیچ بدهی به دولت نداشته باشه دوما اون پست شغلی دوسال در ترکیه تو رزونامه ها داده بشه و اگر پیدا نشد حق داره از خارج استخدام بکنه سوما باید 5 تورک استخدام داشته باشه تا بتونه یه خارجی بگیره و یه مقدار مشخصی قدرت مالی داشته باشه شرکت تا بتونه کفیل خارجی باشه...اگرم به عنوان مهندس بخای بیای که خیلی خیلی سخته بهتر هست ویزای کاری رو با عنوان مهندس نگیرید و متخصص تحقیقات یا توسعه دهنده چنین عنوانی رو برای گرفتن ویزا در پیش بگیرید چون اگر مهندس باشی باید مدرک دانشگاهیت معادل سازی بشه و چند واحد در دانشگاهاشون پاس کنی تا تورو به عنوان مهندس قبول کنه به همین دلیل برای ویزا از عنوان مهندس استفاده نمیکنن...من برنامه نویس هستم و قبل از ورود به خاک ترکیه ویزام رو گرفتن و بعدش وارد ترکیه شدم و غیر ممکن هست بدون ویزا یک دقیقه در خاک ترکیه بمونم چون به قوانین خیلی ارزش میدم ولی خیلی از مهندسین میان ماها گاها سالها با ویزای توریستی کار میکنن بدون اینکه بیمه و فلان داشته باشند که شرکت های درست و حسابی قبول نمیکنن معمولا شرکت های کوچیک استخدامشون میکنه اونم به ندرت چون جریمه سنگینی داره و ریسکش اینه شاید سر سال ویزای توریستیش تمدید نشه ولی وقتی ویزای کاری باشه مجبور به تمدید هست و به اعضای خانوادت هم ویزای خانوادگی باید بده.. شما هزار سال هم با ویزای توریستی توی ترکیه بمونی نمتونی شهروندی ترکیه رو کسب کنی ولی پنج سال بدون وقفه ویزای کاری داشته باشی میتونی اقدام به شهروندی بکنی.. نمیدونم ترکیه ارزش گرفتن شهروندی داره یا نه ولی شاید نگیرم نمیدونم ولی خیلی ها آرزوی شهروندی اینجارو میکنن و درکم نکردم...برای ایرانیا خونه اجاره نمیدن متاسفانه هموطن های ما اینقدر گل کاشتن که میترسن ولی من راحت گرفتم خونه رو دلیل اصلیش اینه که هم ویزای کاری دارم و یارو میدونه که حقوق ثابت دارم هم دستم ویزای معتبری داشتم و هم شرکت گفت من کفالتش رو میکنم برای سال اول ولی سالهای بعد راحت گرفتم خونه رو چون تا خودم نگم نمیفهمن ایرانی هستم و موضع مهم من تورک هستم خودم و اگر تورک باشید فرقی نمیکنه تورک اذربایجان یا قشقایی یا تاتار مثل شهروند ترکیه باهات برخورد میکنن ملتش، خیلی هم احترامت رو نگه میدارن و شکر خدا من تورک هستم و مشکل فرهنگ و زبان نداشتم و گاها حس میکنم در تبریز دارم کار میکنم حس خارجی بودن بهم دست نمیده.. اینجا مثل ایران پول پیش گرفته نمیشه فوقش یک اجاره پیش نگه میدارن، اگر با ادم درست حسابی روبه رو بشی حین خروج این مبلغ رو پس میگیری ولی بدون ویزا وارد بشی و دستتم جایی بند نباشه شاید نتونی بگیری بخاطر این ماه اخر اجاره رو پرداخت نکنید تا بی حساب بشید.. من 4 تا خونه عوض کردم و همچین چیزی ندیدم ولی خوب مسلمانیم امکانش هست.. اگر ویزای کار داشته باشی و قانونی خونه اجاره کنی پدرشو در میارن، خونه رو وقتی میگیرید در قرارداد مینویسه خونه رو رنگ شده تحویل دادم اینجوری تمیزم تحویل میگیرم و باید حواستون جمع باشه اگر دیدی خونه تمیز نیست بگی در قرارداد ذکر کن تا حین تحویل به مشکل نخوریم، اینجا خونه رو اگر از بنگاهی بگیرید باید اندازه یک اجاره خونه هم بهش کمیسیون بدید ولی اگر از سایت پیدا کنید که خود صاحب خونه آگهی زده اون پول میمونه تو جیبتون ولی چون خارجی هستیم و تورکیم بلد نیستین شاید نتونید بگیرید ولی من تا الان به بنگاه جماعت پول ندادم و به طرف پیام میدم که من متخصص  فلان هستم و کار ثابت دارم و میتونم پیرینت بانکی بدم از حسابم و حتی میتونم شرکت رو کفیل کنم یعنی مطمعن باش پولت سر ماه حسابت هست، که خیلی زود تماس میگیره و اون پیگیر میشه باید یکم بیدار باشید و الا راست چپ باید به اینو اون پول بدی... اگر ویزای کاری یا توریستی  نداشته باشی نمیتونی آب برق گاز خونه رو باز کنی و باید باج بدی و یکم بیشتر پرداخت کنی اجاره رو تا طرف اب برقت رو به نام خودش بگیره ولی اگر ویزا داشته باشی میری آب و برق گاز خونه رو به نام میکنی و قبوض به اسمت شما صادر میشه... اینجا مثل ایران نیست ،خونه که اجاره میکنی باید اب برق گاز رو به نام کنی اونم نیاز به کارت اقامت هست، پس حواستون جمع باشه وقتی میخایین بیاین اینجا بدون ویزا دنبال کار باشین، راستی اینجام دلال های هموطن به شدت فعال هستن گیرشون بیوفتی خدا رحمتت کنه دلال ایرانی هم گوشتت رو میخوره هم استخوانت رو ولی دلال تورک حداقل به گوشتت راضی هست...بحث زبان خیلی مهمه و اگر زبان تورکی بلد نباشید پیدا کردن کار و زندگی روزمره سخت میشه اینجام مثل ایران اگر بدونن خارجی هستی گاها میتونن گرون حساب بکنن بلاخره مسلمان هستیم!!! زبان انگلیسی بلد باشید خیلی خوبه ولی همه اینجا انگلیسی بلد نیستن ولی شرکت های بزرگ بهتون شاید کار بدن هر چند تورکی ندونی  ،در مورد تورک های ایران باید بگم خیلی راحت میتونن اینجا کار پیدا کنن تورک قواعدش یکی هست حالا تورک اذربایجان یا تورک ازبکستان یا قرقیز ولی لغات پر کاربرد اذربایجان با ترکیه 60 درصد همپوشانی داره و باید لغات پرکاربرد ترکیه رو استفاده کنید به غیر اینا تفاوتی نداره ولی ایرانی های غیر تورک بهتر هست فکری بکنن در این مورد و الا سخت میشه پیدا کردن کار براشون چون همون ابتدای مصاحبه گیر میکنی میمونی.ایا بیام ترکیه چند ماه بمونم کار میتونم پیدا کنم؟ بله میتونید ولی این کارو نکنید اگر شما اینجا کار پیدا کنی و بخای ویزای کار بگیری باید برگردی ایران تا از اونجا اقدام کنن برای ویزای کاری شما، یا که اگر در ترکیه دارای ویزای توریستی یک ساله باشید اون موقع میشه ویزای توریستی رو به کاری تبدیل کرد بدون اینکه برگردین به ایران ولی سعی کنید از ایران کارو پیدا کنید و با ویزای کاری وراد خاک ترکیه بشید.رنج حقوق در ترکیه برای کسانی که فنی هستن بین 4 تا 6 هزار هست برای متخصص بین 5 تا 8 ولی برای برنامه نویس ها و متخصصین نرم افزار معمولا بیشتر پرداخت میشه برای برنامه نویس میدل 5 تا 7 برای سینویر بین 7 تا 12 ولی شهروند باشی تا 18 هزارم میتونید بگیرید در ترکیه مرخصی با حقوق 12 روز هست سالانه و کل تعطیلات رسمی 14 روز هست که خیلی کم هست و باید بگم زندگی در ترکیه در کار خلاصه میشه یعنی بین کار، زندگی میکنید... ساعات کاری بین هشت تا شیش بعد ظهر هست و شنبه یکشنبه تعطیل.. ولی شرکت های هستن که به حقشون قانع نیستن گاها شنبه هارو هم میگن باید کار کنی البته با ویزای کار وارد بشی و متخصص باشی نمیتونه اینکارو بکنه و معمولا شرکت های بزرگ اینکارو نمیکنن ولی باید حین مصاحبه بپرسی و اینم بگم در بیشتر شرکت های ترکیه اضافه کار معنی نداره و پولش پرداخت نمیشه به ندرت بتونی پیدا کنی جایی که اضافه کار نگهت داره و پرداخت بکنه...نود درصد آگهی های ترکیه از سایت کاریر نشر میشه https://www.kariyer.net/ از یک تورک در پر کردن رزومه کمک بگیرید و سعی کنید کامل پر کنید.. از لینکدینم میتونید کار پیدا کنیددر قسمت بعد مقاله به سوالاتی که در کامنت میشه خواهم پرداخت.موفق و پیروز باشید.</description>
                <category>Ali Mahmoodi</category>
                <author>Ali Mahmoodi</author>
                <pubDate>Sun, 24 Jan 2021 15:24:51 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت compose file docker قسمت اول</title>
                <link>https://virgool.io/@ali.mahmoodi.heris/%D8%B3%D8%A7%D8%AE%D8%AA-compose-file-docker-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-okiep9hafgej</link>
                <description>در مقالات قبلی لینک یک - لینک دو نحوه ساخت داکر فایل را توضیح دادم، حال زمان آن فرا رسیده که یک قدم جلوتر بریم، قدرت داکر فقط ساخت کانتینر های ساده نیست، از نظر من قدرت داکر یکسری کانتیرنر متفاوت را به صورت خیلی ساده ساختن، اجرا کردن و مدیریت کردنش هست، برای این کار از کامپوز فایل استفاده خواهیم کرد.اگر بخواهیم در مورد کامپوز  فایل داکر یه فکری داشته باشیم، به نظرم داکر را با یک ارکستر مقایسه کردن هست.بیاید یک محاسبه سمفونی را انجام دهیم. برای محاسبه نیاز داریم هر کس نقش خود را به صورت دقیق انجام دهد و خود ارکستر هم باید هماهنگ با همه کار کند، کانتینر های داکر هم مانند موزیسین های متفاوت هست. در این متافور برای هماهنگ کردن همه نیاز به یک سرپرست تیم داریم. کامپوز فایل داکر،مانند سرپرست ارکسترهایی هست که همه را در یک صفحه و یک ریتم نگه میدارد. کانتینر یه اسطلاح مشترک برای تنظیم و ارکستراسیون در کانتینر سازی هست و کامپوز فایل داکر رهبر تمام کانتینر ها.بیاید شروع کنیم.کامپوز فایل داکر برای اینکه متوجه بشود چگونه کار کنه یه پوشه ایجاد کنید و در داخل آن نوشته های پاراف زیر را در فایل docker-compose.yml ذخیره کنید.version: &#x27;2&#x27;services: nginx-compose-project-1:      image: nginx:latest      ports:         - &quot;8080:80&quot; nginx-compose-project-2:      image: nginx:latest      ports:         - &quot;8081:80&quot;با نوشتن “version: ‘2’ ” در سطر اول فایل یامل میخواهیم بگویم که این فایل ورژن 1.6 هست و نسبت به این ورژن فایل رو تفسیر بکن. فایل docker-compose.yml حاوی اطلاعات، ساخت ایمیج ها،پارامتر های مورد نیاز کانتینرها، اجرای کانتینرها و چگونگی ارتباطاتشان هست.مهم ترین بخش این فایل همانطور که مشاهده میکیند تعریف “:services” می باشد، همان بخشی که میخواهیم کانتینرهامون رو طراحی کنیم و شکل بدیم. در اینجا میگیم کانتینر “nginx-compose-project-1” و“nginx-compose-project-2” را اجرا بکن، همانطور که مشاهده میکنید هر دو زیر بخش services می باشند، از چه ایمیجی باید ساخته شود و روی چه پورتی باید مپ شود را هم مشخص میکنیم برای هر دو کانتینر. اگر نیاز باشد Volume و متغیرهای Environment را هم میتوایند همین جا اضافه کنید. معمولا پارامترهایی که برای اجرای یک کانتینر  یا ساخت ایمیج نیاز هست را در این قسمت مشاهده میکنید.برای ساخت و اجرای کانتینر ها بجای اینکه از چندین دستور داکر استفاده کنیم تنها با یک دستور این کار قابل انجام هست اگر از کامپوز فایل استفاده کنیم.برای ایجاد یک کامپوز فایل داکر و اطلاعات کافی را از این قسمت میتوانید مطالعه بکنید.به طور خلاصه کامپوز فایل داکر یه ابزار کاربردی خیلی آسان برای اجرای اپلیکیشن پیچده میباشد. نحوه اجرای کامپوز فایل داکرابتدا از خط فرمان به مسیر docker-compose.yml سویچ شده و دستور زیر را نوشته و اجرا میکنیم.docker-compose upداکر کامپوز، کانتینر های مارو به صورت ایزوله و داخل یک شبکه مستقر خواهد کرد. برای دسترسی به کانتینر های در حال اجرا، یا از طریق شبکه ای که در آن هستند و یا از طریق لینک هایی که در سیستم عامل تعریف شده امکان پذیر هست. سطر اول لیست زیر، مشخصات شبکه ساخته شده هست.Creating network &quot;nginx-compose-project_default&quot; with the default driverCreating nginx-compose-project_nginx-compose-project-2_1 ... doneCreating nginx-compose-project_nginx-compose-project-1_1 ... doneAttaching to nginx-compose-project_nginx-compose-project-1_1, nginx-compose-project_nginx-compose-project-2_1در این بخش فقط با اجرای دستور docker-compose up دو کانتینر توانستیم ایجاد کنیم. از پورت های 8080 و 8081 میتوانید از براوزر دسترسی داشته باشید.یک کنسول جدید باز کنید و با اجرای دستور “docker ps” کانتینرهایی که در حال اجرا هستند رو میتوانید مشاهده بکنید.CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES4c5104b1b16d        nginx:latest        &quot;nginx -g &#x27;daemon of…&quot;   55 seconds ago      Up 52 seconds       0.0.0.0:8080-&gt;80/tcp   nginx-compose-project_nginx-compose-project-1_13c722827b97a        nginx:latest        &quot;nginx -g &#x27;daemon of…&quot;   55 seconds ago      Up 52 seconds       0.0.0.0:8081-&gt;80/tcp   nginx-compose-project_nginx-compose-project-2_1در کنسولی که دستور “docker-compose up” را اجرا کرده بودید با دستور Ctrl+C خارج بشید، وقتی دوباره دستور “docker ps” را اجرا کنید، خالی بودن لیست را متوجه خواهید شد.اگر با دستور  “docker-compose up -d” اجرا کرده بودیم حین خروج از کانتینرها، متوقف نمیشدند.برای دیدن لیست داکر کامپوزهای در حال اجرای آنها، بعد از وارد شدن به مسیر docker-compose.yml  دستور زیر را اجرا بکنید.docker-compose psاجرای دستور بالا همچین نتیجه های خواهد داشت.Name                               Command          State          Ports-----------------------------------------------------------------------------------------------------nginx-compose-project_nginx-compose-project-1_1   nginx -g daemon off;   Up      0.0.0.0:8080-&gt;80/tcpnginx-compose-project_nginx-compose-project-2_1   nginx -g daemon off;   Up      0.0.0.0:8081-&gt;80/tcpبا دستور زیر به لاگ های داکر کامپوز های در حال اجرا میتوانید نگاه کنید.docker-compose logs کامپوز فایلی را که با پارامتر d- ران کردیم برای خارج شدن و متوقف کردنش بعد از وارد شدن به مسیر فایل یامل دستور زیر را اجرا کنید.docker-compose downبعد از اجرای این دستور شاهد متوقف شدن کانتینرهای ساخته شده کامپوز فایل و حذف شدن شبکه پیشفرض ایجاد شده خواهد بود.Stopping nginx-compose-project_nginx-compose-project-1_1 ... doneStopping nginx-compose-project_nginx-compose-project-2_1 ... doneRemoving nginx-compose-project_nginx-compose-project-1_1 ... doneRemoving nginx-compose-project_nginx-compose-project-2_1 ... doneRemoving network nginx-compose-project_defaultبعضی مواقع نیاز هست بعضی از سرویس های کامپوز فایل را بیش از یک بار اجرا کنیم برای این کار کافیست حین تعریف پورت، فقط پورتی که از داخل کانتینر به بیرون تعریف شده را بنویسیم. مانندversion: &#x27;2&#x27;services:   nginx-compose-project-1:      image: nginx:latest      ports:         - &quot;8080:80&quot;   nginx-compose-project-2:      image: nginx:latest      ports:         - &quot;8081:80&quot;   nginx-compose-project-3:      image: nginx:latest      ports:         - &quot;80&quot;حال برای اجرای دو کانتینر از “nginx-compose-project-3” مانند دستور زیر عمل میکنیم.docker-compose up --scale nginx-compose-project-3=2 -dبعد از اجرا دستور بالا، با کمک دستور “docker-compose ps” لیستی شبیه زیر خواهید دید.Name                                  Command          State           Ports------------------------------------------------------------------------------------------------------------nginx-compose-project-proxy_nginx-compose-project-1_1   nginx -g daemon off;   Up      0.0.0.0:8080-&gt;80/tcpnginx-compose-project-proxy_nginx-compose-project-2_1   nginx -g daemon off;   Up      0.0.0.0:8081-&gt;80/tcpnginx-compose-project-proxy_nginx-compose-project-3_1   nginx -g daemon off;   Up      0.0.0.0:32769-&gt;80/tcpnginx-compose-project-proxy_nginx-compose-project-3_2   nginx -g daemon off;   Up      0.0.0.0:32768-&gt;80/tcpهمانطور که میبیند در لیست بالا از سرویس “nginx-compose-project-3” دو نمونه روی پا هست و از پورت های 32769 و 32768 قابل دسترس از براوزر میباشد.نکته:داکر کامپوز در ویندوز و مک به صورت اتوماتیک نصب میشود ولی اگر در لینوکس کار میکنید احتمالا به صورت دستی باید نصب بکنید. نحوه نصب را از این قسمت میتوانید مطالعه بکنید.طی این هفته ویدیو این آموزش در یوتیوب بنده در دسترس خواهد بود. موفق باشید</description>
                <category>Ali Mahmoodi</category>
                <author>Ali Mahmoodi</author>
                <pubDate>Mon, 21 Sep 2020 01:21:19 +0330</pubDate>
            </item>
                    <item>
                <title>چرا نام گذاری درست در برنامه نویسی اینقدر حیاتی هست؟</title>
                <link>https://virgool.io/cheyab-blog/%DA%86%D8%B1%D8%A7-%D9%86%D8%A7%D9%85-%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C-%D8%AF%D8%B1%D8%B3%D8%AA-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A7%DB%8C%D9%86%D9%82%D8%AF%D8%B1-%D8%AD%DB%8C%D8%A7%D8%AA%DB%8C-%D9%87%D8%B3%D8%AA-pzoawdqio3gk</link>
                <description>برای نوشتن کد تمیز، نامگذاری آبجکت ها، متغیر ها ، کلاس ها و ...  یکی از مهمترین پارمترها می باشد به طوری که غیر قابل چشم پوشی هست، زیرا بدون داشتن نام های خونا و با قاعده و یک دست، کد نوشته شده  خوانایی اش را از دست داده و مسیر تبدیل شدن به کد کثیف را هموارتر می کند. به نامگذاری سطر پایین لطفا دقت کنید.int n;برنامه نویسی که به این شکل متغیر تعریف میکند چند دلیل دارد.تازه وارد دنیای برنامه نویسی شده و هنوز قوانین ابتدایی را نمیداند! خیلی عجله دارد و در حال تست قسمتی از کار هست!چنین رفتاری در دنیای کاری او تبدیل به یک عادت شده هست!تعریف چنین متغیری موقعی دردسر ساز میشود که بلوک های کد زیاد می شوند و همین متغیر و در چندین جای مختلف استفاده میکند در چنین حالتی برنامه نویس وقتی یکم پایین تر می آید کلا فراموش میکنه متغیر n چی بود و مجبور می شود کد نوشته شده به دست خود را مهندسی معکوس بکند، حال اگر چندین متغیر به این شکل تعریف کرده باشد، خواندن همچین کدی چندان فرقی با یک کتیبه میخی نخواهد داشت، از بین بردن خوانایی کد احتمال خطا منطقی را بالا خواهد برد، طوری که متغیر n را با یک متغیر دیگر اشتباه بگیرد، جایز هم هست، زیرا متغیر معرف خودش نیست.به نحوی نامگذاری در سطر پایین دقت کنید.public List&lt;Users&gt; HemeroListkon(){}public List&lt;Users&gt; BaGorohListkon(int shomareGoroh){}نامگذاری متد به فارسی در مرحله اول به نظر میرسد خوانا هست و مشکلی ندارد!!ایراد فینگلیش دادن اسم متغیر ها چیست؟ فکر کنید ما میخواهیم در پروژه از طریق رفلکشن متدهایی که کارشون واکشتی دیتا از دیتابیس هست رو کش بکنیم و یا در قسمت یونیت تست پروژه بعد اینکه یک ورژن جدید دادیم میخایم به جنگینز یا TFS بگیم فقط توابعی که کارشون واکشی دیتا هست رو تست و دیپلوی بکن چون نمیخام کل پروژه بیلد بکنم. در چنین حالتی فانکشن های واکشی ما هیچ معلفه مشابهی ندارند و باید یکی یکی همه رو بنویسیم و بعد چند روز اگر دوباره تابع جدیدی نوشتیم اونم بریم دستی اضافه کنیم و راه رو هم برای خطا هم کد کثیف هموار میکنم!! ولی اگر مثل کد زیر تعریف میشدندpublic List&lt;Users&gt; GetList(){}public List&lt;Users&gt; GetByCategory(int categoryId){}کافی بود بگیم متدهایی که با Get شروع میشوند، با استفاده از رفلکشن ها مکانیزم کش رو انجام بده، یا فقط یونیت تست این توابع رو انجام بده، یا فقط اینارو دیپلوی بکن. زبان مشترک یا Common language: اگر پروژه رو گروهی در حال توسعه دادن باشیم من از کلمه Get استفاده میکنم و دوستم از Fech ،این یعنی مشکلات ... فقط قسمت کشف عملکرد فانکشن ها یه معمایی میشه!! به همین دلیل چه تنهایی چه گروهی برای نامگذاری متغیرها و فانکشن ها باید قوانین تعریف و استفاده کرد تا وارد حیطه کد کثیف نشویم.شاید الان بگید چرا به این موضوعات یونیت تست و یا کش وارد شدیم!! دلیلش اینه ما هر روز داریم خودمون رو آپدیت میکینم و پروژه بزرگ تر میشود و الان شاید آسپکت پروگرمینگ رو ندونی، یونیت تست ننویسی ولی بعد چند سال وقتی به بحث آسپکت پروگرمینگ و یا جنکینز و یونیت تست آشنا شدین، میگید من اون موقع از اسم گذاری فارسی استفاده کردم و فکر میکردم کارم درسته ولی ای کاش اینکارو نمیکردم ... شما برنامه نویسی هستی که روز به روز آپدیت میشی و پیشرفت میکنی، برای اینکه در آینده به چنین مشکلاتی برنخوری نیاز هست این اصول رو رعایت بکنی. با گذشت زمان متوجه میشوید که این قوانین از کد شما محافظت میکنه فعلا در این مورد به من اطمینان کنید.از اسم گذاری های مخفف و مشابه اجتناب کرده و از طولانی بودن نام ها نترسید. به کد زیر دقت کنیدچنین کدی گویای کثیف بودن و ناخوانا بودن خود هست. توسعه دهنده بعد چند روز در این قسمت بخواهد تغیری ایجاد بکند باید مهندسی معکوس انجام دهد. نام متغیر باید گویای عملکرد خود باشد.به سمپل زیر دقت کنید.همانطور که می بینید توسعه دهنده از اسم های مخفف استفاده کرده و همین امر باعث شده برای DataTable , DateTime از یک مخفف استفاده بکنه یکی رو dt دیگری رو Dt استفاده کرده، در همین چند خط کد ساده به دلیل اینکه از اسم گذاری کوتاه و اشتباه استفاده شده خوانایی کد رو نزدیک به صفر کرده.اسم گذاری های مخفف گاها بدون اینکه متوجه بشیم ما رو دچار اشتباه میکنه، باعث نوشتن کد ناخوانا، غیرقابل توسعه ، خطا پذیر ... میشود. حال همین کد بالایی رو بدون اسم های مخخف باز نویسی میکنم.همانطور که می بیند فقط با رعایت کردن اسم ها کلی خوانایی کد بالا رفت، ریسک پذیری خطاهای منطقی ناشی از اسم های مشابه از بین رفت، کد قابل توسعه هست و بعد چند روز برگردیم متوجه میشیم هر متغیر به چه منظور استفاده شده چرا که متغیرها گویای عملکرد و جنس خود هستند و نیازی به مهندسی معکوس نیست.نامگذاری در زبان ها. مثلا در سی شارپ متد ها پاسکال کیس نوشته میشود ولی در جاوا کمل کیس نوشته میشود. بنابراین باید قوانین نامگذاری یک زبان را بخوانیم تا زبان مشترک با دیگر برنامه نویسان اون زبان رو داشته باشیم و یا برای پروژه و سازمان یک سند نامگذاری بنویسم و به بقیه اعضای تیم بگیم که مطابق سند نامگذاری هارا انجام بدهند.پاسکال کیس  Pascal Case: یعنی حروف اول کلمات بزرگ باشند مثل GetUsersکمل کیس Camel Case: یعتی اولین کلمه با حروف کوچک و کلمات بعدی حروف اولشون بزرگ باشند مثل getUsersهمانطور که گفتیم هر زبان علاوه بر سیاست های نامگذاری ما خودش قوانینی رو دارد و با گوگل کردن کیورد پایین میتوانیم زبان مربوطه رو مطالعه کنیم.C# Naming ConventionsJava Naming Conventionspython Naming Conventionsدر این مقاله بنده هدفم این بود که آورده های نامگذاری اوصولی رو برسی کنیم و ببینیم که این قوانین چگونه از ما در برابر مشکلات گوناگون محافظت میکنه که امیدوارم تونسته باشم. به زودی یک دوره آموزی معماری تمیز و کد میز تولید خواهم کرد و قسمت هایی از آن رو از همینجا نشر خواهم داد همراه با مقاله تا دیدار بعد بدرود.</description>
                <category>Ali Mahmoodi</category>
                <author>Ali Mahmoodi</author>
                <pubDate>Mon, 14 Sep 2020 05:31:29 +0430</pubDate>
            </item>
                    <item>
                <title>داکرایز پروژه چند لایه ای Asp Net Core MVC</title>
                <link>https://virgool.io/@ali.mahmoodi.heris/%D8%AF%D8%A7%DA%A9%D8%B1%D8%A7%DB%8C%D8%B2-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%DA%86%D9%86%D8%AF-%D9%84%D8%A7%DB%8C%D9%87-%D8%A7%DB%8C-asp-net-core-mvc-lpcbpdfob4s2</link>
                <description>فیلم کامل این مقاله در کانال youtube بنده موجود هست.قسمت اول: https://youtu.be/gX0K5S6Gim8 قسمت دوم: https://youtu.be/9dDrwrQi-SI در این مقاله داکر و یا دات نت کور را برسی نمیکنیم، هدف داکرایز پروژه می باشد.ابتدا یک پروژه در ویژوال استودیو 2019 به اسم AspNetCoreForDocker ایجاد کرده و نوع پروژه AspNetCoreWebApplication انتخاب میکینم. این پروژه از دانت کور 3.1 ، کتابخانه ها از دانت استاندارد 2.1 اسفتاده میکند.مروری بر NET Core CLI .بدهیی هست که برای داکرایز هر پروژه باید به چرخه حیات بیلد و پابیلش اون در لایه های پایین تر آشنایی داشت. IDE های متفاوتی هستند که میتوانیم با آن یک پروژه دات نتی ایجاد، اجرا، بیلد، پابلیش کنیم. اما محیط های برنامه نویسی چگونه چنین کاری را انجام میدهند؟ دات نت کور دارای یک SDK میباشد، IDE از این استفاده میکند و کارهای ویژویالی ما را گرفته و از طریق کامند لاین CLI با SDK  ارتباط برقرا میکند و اون خواسته ما انجام میشود. برای مثال وقتی ما میگیم یک پروژه کنسولی بساز یا بیلد و اجرا بکن پشت پرده IDE  همچین کامندی را به SDK ارسال میکیند.dotnet new console ایجاد پروژه  dotnet build --output /build_output بیلد پروژه dotnet /build_output/my_app.dll اجرا پروژه https://docs.microsoft.com/tr-tr/dotnet/core/tools/ اگر در سیستم ما SDK  دات نت کور نصب باشد ما میتواینم از CMD  با این دستورات یک پروژه بسازیم و آن را بیلد و اجرا کنیم و نیازی به IDE های متفاوت نداریم، این مطلب به چه کار ما می آید؟ وقتی ما بخواهیم پروژه ای رو به صورت اتوماتیک بیلد و پابلش کنیم نیاز هست این دستورات را بدانیم و از طریق کامند لاین اینترفیس دستورات را پشت سر هم بنویسم تا خروجی مورد نظر را بگیریم.نوشتن داکر فایل برای پروژه دانت کور.ابتدا در کنار فایل Sln پروژه یه فایل دیگری به اسم Dockerfile بسازید.داکر فایل یک فایل متنی بدون پسوند هست و حساس به حروف کوچک و بزرگ میباشد پس در نوشتن اسم دقت کافی داشته باشید. این فایل را میتوانید با Notepad و یا هر ادیتوری باز کنید من ترجیحم Visual Studio Code هست. بعد باز کردن فایل کد زیر را داخلش کپی کنید.FROM  mcr.microsoft.com/dotnet/core/sdk:3.1 as build WORKDIR /appCOPY ./AspNetCoreForDocker/*.csproj ./AspNetCoreForDocker/COPY ./Business/*.csproj ./Business/COPY *.sln .RUN dotnet restoreCOPY . .RUN dotnet publish -c Release ./AspNetCoreForDocker/*.csproj -o /publish/FROM mcr.microsoft.com/dotnet/core/aspnet:3.1WORKDIR /appCOPY --from=build /publish .ENV ASPNETCORE_URLS=&quot;http://*:4500&quot;ENTRYPOINT [ &quot;dotnet&quot;,&quot;AspNetCoreForDocker.dll&quot; ]اگر از ویژیوال استادیو کد استفاده میکنید بهتر هست extension داکر رو نصب کنید.FROM  mcr.microsoft.com/dotnet/core/sdk:3.1 as build  در این خط از کد ما به داکر میگیم از بیس ایمیج نسخه 3.1 SDK خود مایکروسافت موجود در داکر هاب میخواهیم استفاده بکنیم پس برو دانلود و نصب کن. با کیورد as یه اسم build هم بهش میدیم و میگیم در کل این پروژه اگر کلمه بیلد رو جایی آوردیم منظور ایمیج SDK هست، چون طولانی هست نوشتن کل خط با یک کلمه build خلاصه میکینم.WORKDIR /app یک پوشه app درست میکنه و داخلش وارد میشه.COPY ./AspNetCoreForDocker/*.csproj ./AspNetCoreForDocker/ در کد بالایی میگیم از جایی که داکر فایل هست دنبال پوشه AspNetCoreForDocker بگرد و برو داخلش،داخل پوشه هم  بگرد دنبال فایلی که پسوندش csproj هست، وقتی پیدا کردی داخل WORKDIR  یه پوشه AspNetCoreForDocker بساز  برو داخلش و فایل csproj  کپی بکن. مثل خط زیر.app/AspNetCoreForDocker/ csproj فایل   نحوه کار دستور کپی COPY source destination سورس source آدرس جایی هست که داکر فایل اونجاست پس بنابراین بجای سورس اگر نقطه بگذارم، منظور مسیر داکر فایل هست.حال اگر یک نقطه اسلش و نام یه پوشه رو بنویسم./SrcFolderName/ یعنی از جایی که داکر فایل هست سویچ شو برو داخل پوشه ی SrcFolderNameدیستنیشن destination جایی هست که WORKDIR اشاره میکنه، یعنی بعد یک فاصله از سورس، دوباره یک نقطه بگذاریم یعنی میگیم داخل پوشه app هستیم.COPY source ./DesFolderName/حال یک نقطه اسلش بزنیم و نام یک پوشه ای رو بنویسیم یعنی داخل پوشه app برو این پوشه DesFolderNameحال اگر بگیم  کپی و با فاصله دوتا نطقه بذاریم COPY  . .یعنی جایی که داکر فایل هست تمام فایل و پوشه هارو کپی بکن به ورک دایر که پوشه app هست. چون طبق توضیح نقطه اول آدرس جایی که داکر فایل ایستاده هست و نقطه دوم آدرس جایی هست که WORKDIR ساخته. خیلی تلاش کردم این قسمت رو متوجه بشید هر چند در ویدیو آموزشی هم توضیح دادم و امیدوارم متوجه شده باشین چون خیلی مهم هست.دقت کنید در حین کپی کردن در قسمت مقصد یا همون دیستنیشن اگر نام پوشه ای که نوشتین داخل ورک دایر نباشه خودش اتوماتیک خواهد ساخت. به اسلش ها دقت کنید مهم هستند.COPY ./Business/*.csproj ./Business/ کپی فایل csproj  پروژه بیزنس به داخل پوشه بیزنس داخل ورک دایر /app/BusinessCOPY *.sln . کپی فایل sln موجود در کنار فایل داکر، به ورک دایر، که همان app هست. دقت کنید نقطه دوم یعنی داخل ورک دایر که همان app هست.RUN dotnet restoreباز دستو dot net cli  هست، اگر پروژه وابستگی داره و یا وابستگی ها آپدیت شدن اونهارو دانلود و آپدیت میکنه تا در قسمت بیلد مشکلی پیش نیاد.COPY . .هر چی  که  در مسیر داکر فایل هست کپی بکن به ورک دایر که همان app هست.بخاطر سوال یکی از دوستان این قسمت رو نیاز هست یکم بازتر بکنم:اگر قرار بود کل فایل هارو کپی کنم چرا در سطر سوم وچهارم فایل پروژه رو کپی کردیم؟ در داخل داکر فایل هر سطری که نوشته میشه داخل ایمیج یک لایه میشه، و هنگام بیلد کردن اگر در اون لایه تغیری انجام بشه فقط اون لایه بیلد میشه اگر نباشه از کشی که خودش ساخته میره از کش استفاده میکنه تا سرعت بیلد بالا باشه، یکسری تغیرات مثل اضافه کردن یه رفرنس باعث میشه فایل پروژه آپدیت بشه، دقت کنید ممکن هست فایل پروژه به دلیل اضافه کردن یا اپدیت کردن یک کتابخانه آپدیت بشه ولی داخل دیگر فایل ها و ساختار پروژه چیزی آپدیت نشه، در این صورت تنها لایه فایل پروژه csproj  بیلد میشه و بقیه از کش سیستم استفاده میکنه ولی میتوانستیم ننویسم و بگیم هر چی شد مهم نیست برو کل فایل هارو در هر بار بیلد کپی بکن! به لحاظ بست پرکتیس این درست نیست و ما با اضافه کردن لایه های دیگر میگیم اگر در لایه مورد نظر تغیری هست برو بیلدش بکن و الا از کش استفاده بکن، برعکس اینم هست شاید یک عکس رو آپدیت کردیم و در کتابخانه ها چیزی تغیر نکرده این بار لایه فایل csproj  پروژه از کش استفاده میکنه ولی لایه بعد که کل فایل هارو کپی میکنه از اول بیلد میشه و بخاطر تغیرش از کش استفاده نمیکنه. RUN dotnet publish -c Release ./AspNetCoreForDocker/*.csproj -o /publish/با کمک Dot Net CLI. دستورات کامندی SDK ، پروژه رو بیلد میکینم. حال اینجا اگر به پلتفورم خاصی میخاین پابلیش بشه باید معماری اونم بنویسید و حتما از بیس ایمیچ اون معماری استفاده کنید مثلا ARM یا لینوکس ما برای ویندوز پابلیش کردیم که فکر کنم برای لینوکسم کار بکنه همین.دقت کنید بعد -o  ما یک پوشه بهش معرفی کردیم و گفتیم بیلد بکن و بریز داخل این پوشه. ما تا این قسمت پروژه رو داخل SDK دات نت کور کپی کردیم و داخل ایمیج به پوشه پابلیش خروجی رو ریختیم. FROM mcr.microsoft.com/dotnet/core/aspnet:3.1دقت داشته باشید ما با خود ایمیج SDK پروژه رو می توانیم ران بکنیم ولی چون حجم ایمیج نهایی خیلی بزرگ میشه، فضای اضافی در هارد میگیره و حین اجرا کردن کانتینر یکم دیر اجرا  میشه و داخل ایمیج SDK  کلی امکانات هست که در محیط اجرا به کارمون نمیاد، درستش اینه از ایمیج اجرا کننده پروژه دات نت کور استفاده کنیم.بعد از بلید کل فایل قسمت ایمیج SDK  پاک خواهد شد و تنها قسمت اجرایی خواهد ماند.WORKDIR /appباز برای ایمیج اجرای یه ورک دایر می سازهCOPY --from=build /publish .میخیام پروژه پابلیش شده ایمیج قبلی که SDK  هست رو کپی کنیم به ورک دایر، برای اینکه به فایل های یک ایمیج دیگه دسترسی داشته باشیم از دستور from-- استفاده میکینم و اگر دقت کنید کلمه بیلد رو نوشتم چون ابتدای پروژه به SDK  یک اسم بیلد دادم که ایجا بلند بلند سطر رو ننویسم. گفتیم داخل ایمیج بیلد برو پوشه پابلیش همه رو کپی بکن به ورک دایر که app هست.ENV ASPNETCORE_URLS=&quot;http://*:4500&quot;هر فریم ورکی یکسری Environment داره که از طریق اون میتوینم پروژه رو درحالت های مختلف اجرا بکینم.چون داکر محیط عملیاتی هست، لوکال هاست معنی نداره ما اینجا از کیورد ASPNETCORE_URLS استفاده کرده و گفتیم آی پی هر چی میخاد باشه، یعنی آی پی ماشینی که توش اجرا هستی رو بگیر که از سیستم به سیستم این آی پی تغیر میکنه. بعدش گفتیم روی پورت 4500 اجرا شو. دیفالت خودش 5000 هستش.اگر این رو ندیم از یک سیستم دیگه کسی نمیتونه بهش دسترسی پیدا بکنه و فقط روی خود ماشین میتونیم بهش دسترسی داشته باشیم. البته میشه روی لوکال رانش کرد و از طریق Nginx براش پروکسی تعیریف کرد که در سر فرصت در یه مقاله دیگه بهش خواهم پرداخت.ENTRYPOINT [ &quot;dotnet&quot;,&quot;AspNetCoreForDocker.dll&quot; ]باز از طریق net core cli پروژه رو اجرا میکنیم. دقت کنید فایل dll پروژه اصلی رو میدیم نه فایل exe.بعد ذخیره داکر فایل از پاور شل به مسیر داکر فایل سوییچ بشید و با دستور زیر فایل رو بیلد کنید.docker build -t web_image .بعد بیلد شدن ازش یک کانتینر با دستور زیر میسازیم.docker run --name web_app -p 4000:4500 web_imageبعد اجرای کانتینر با براوزر آدرس زیر رو وارد کنید و نتیجه رو ببینید.http://localhost:4000/تمامی مراحل قدم به قدم در ویدیو توضیح داده شده و در این مقاله یکم بیشتر به جزییات پرداختیم.موفق و پیروز باشید.</description>
                <category>Ali Mahmoodi</category>
                <author>Ali Mahmoodi</author>
                <pubDate>Sun, 13 Sep 2020 17:02:16 +0430</pubDate>
            </item>
                    <item>
                <title>نحوه ساخت ایمیج سفارشی MySql در داکر</title>
                <link>https://virgool.io/wptips/%D9%86%D8%AD%D9%88%D9%87-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%A7%DB%8C%D9%85%DB%8C%D8%AC-%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C-mysql-%D8%AF%D8%B1-%D8%AF%D8%A7%DA%A9%D8%B1-zejj8mcpsoxi</link>
                <description>فیلم کامل این مقاله در کانال  youtube بنده موجود هست. https://youtu.be/wz6vG3eE7u4 · داکرایز کردن ساختار دیتابیس و دادهای پروژه· ایجاد کردن کاربر دیتابیس· اتصال به کانتینر با نرم افزار MySql Wrokbench  از بیرون داکر.در این مقاله داکر و یا دیتابیس را مورد برسی قرار نمیدهیم، هدف مقاله داکرایز کردن یک دیتابیس می باشد.ابتدا سعی میکنیم یک دیتابیس ساخته و بعد ساختن، کل ساختار و دیتاهای جداول را در یک فایل خروجی بگیریم، برای این کار از اخرین نسخه مای اسکیول ال و ورک بنج استفاده میکنیم.با دستور زیر از آخرین نسخه مای اسکیول موجود در داکر هاب یک کانتینر می سازیم و بعد سعی میکینم با ورک بنج بهش وصل بشیم و دیتابیسی داخلش ساخته و خروجی بگیریم ازش.docker run --name default_db -d -e MYSQL_ROOT_PASSWORD=123 -p 3306:3306 mysql:latestبعد ساخت کانتینر سعی میکنیم با نرم افزار MySql Workbench  بهش وصل بشیم. از لینک زیر آخرین نسخه ورک بنچ را میتوانید دانلود کنید.https://dev.mysql.com/downloads/workbench/بعد نصب و اجرا کردن ورک بنچ یک کانکشن به کانتینر میسازیم مثل تصویر زیر.اضافه کردن یک کانکشن جدیددر قسمت کانکشن یک اسم داده و مشخصات کانتینر را وارد میکنیم، پسور 123 برای یوزر روت را داده و از لوکال هاست با پورت 3306 وصل می شویم.ساخت کاکشن به کانتینر داکربعد اتصال یک دیتابیس با نام testdb میسازیم.ایجاد دیتابیس فیکیک جدول به اسم users  میسازیم و یکسری دیتای فیک داخل جدود وارد میکنیم.ساخت جدول usersوارد کردن دیتای فیک به جدول usersبعد ساخت دیتابیس و ایجاد جدول و اضافه کردن دیتای فیک از این دیتابیس همراه با ساختار و دیتاهای جدول یه خروجی در قالب فایل اسکریپتی میگیریم.اسکپورت دیتابیس در فایل testdbحال فایل اسکریپت دیتابیس آماده هست برای داکرایز کردن، شما اگر دیتابیس از قبل دارید این مراحل نیاز نیست انجام بدین و یا اگر دیتاهای داخل دیتابیس را نیاز ندارید میتوانید حین خروجی گرفتن فقط ساختار دیتابیس رو انتخاب کنید.داکرایز دیتابیس و ساخت ایمیج سفارشی.ابتدا یک فایل متنی به اسم Dockerfile ایجاد میکینم، نام حساس به حروف بزرگ و کوچک میباشد، فایل باید بدون هر پسوندی باشد. من از Visual Studio Code استفاده میکنم شما می توانید از هر ادیتوری استفاده بکنید.نکته: فایل داکر و فایل اسکریپت دیتابیس باید هر دو در یک مسیر باشند.FROM mysql:latestENV MYSQL_ROOT_PASSWORD 123ENV MYSQL_DATABASE testdbENV MYSQL_USER my_userENV MYSQL_PASSWORD 1234ADD testdb.sql /docker-entrypoint-initdb.dEXPOSE 3306 سطر یکم: بیس ایمیج رو مشخص میکینم، تگ latest  آخرین نسخه MySql موجود در Docker Hub رو استفاده خواهد کرد.سطر دوم:با تعریف این Environment به یوزر روت پسورد ست کرده و در نتیجه دسترسی به دیتابیس از بیرون به کاربر روت باز میشود.سطر سوم: با تعریف این Environment دیتابیسی به اسم tsetdb ایجاد میشود، دقت کنید داخل فایل اسکریپت، قطعه کد CREATE DATABASE  IF NOT EXISTS testdb نوشته شده یعنی اگر سطر سوم از داکر فایل نوشته نشود اسکریپت خودش دیتابیس رو اگر نباشد خواهد ساخت. دقت داشته باشید داخل اسکریپت بعد دستور ساخت دیتابیس USE testdb نوشته شده باشد.این دو خط اول فایل اسکریپ باید موجود باشدسطر چهارم: با تعریف این Environment یک یوزر به اسم my_user ساخته خواهد شد.سطر پنجم: با تعریف این Environment پسورد my_user ست شده و در نهایت فعال خواهد بود.سطر شیشم: با دستور ADD فایل اسکریپتی که از دیتابیس خروجی گرفتیم رو به ایمیچ اضافه میکینم.سطر هفتم: با دستور EXPOSE پورتی که کانتینر مای اسکیوال روی اون باید اجرا شود را مشخص میکینم.فایل را در کنار فایل اسکریپت ذخیره کرده و از پاور شل به همان مسیر وارد بشید.وارد مسیر فایل ها شدن.نکته:ابتدا کانتینر قبلی را با دستور  Docker rm defult_db --force پاک میکنیم.با دستور زیر داکر فایل را بیلد میکینم.docker build -t custom_mysql_image .بعد بیلد شدن از ایمیج بیلد شده یک کانتینر با دستور زیر میسازیم.docker run --name customdb -p3306:3306 -d custom_mysql_imageدر این مرحله دیتابیس داکرایز شده و یک کانتینر ازش ساخته شده. حال میتوانیم با MySql Workbench متصل شده به شکلی که در بالا گفته شد و دیتابیس را داخل آن مشاهده کرد.موفق و پیروز باشید.</description>
                <category>Ali Mahmoodi</category>
                <author>Ali Mahmoodi</author>
                <pubDate>Sun, 13 Sep 2020 06:28:43 +0430</pubDate>
            </item>
            </channel>
</rss>