
Quantum computing holds the potential to deliver faster and more precise solutions to complex problems that remain intractable for classical computers. However, the limited number of qubits and the high error rates of current quantum devices restrict the size of computations that can be successfully performed. An approach to address this is quantum circuit cutting, which divides a quantum computation into multiple smaller parts executable on available quantum devices and classically combines their results to obtain the original computation's outcome. Even when quantum devices mature, the importance of circuit cutting may even increase because of the addition of quantum devices with limited numbers of qubits to the existing computing infrastructure. However, there is a lack of comprehensive surveys comparing current circuit cutting techniques, let alone providing abstract guidance for quantum software engineers in applying them. Moreover, to facilitate collaboration, quantum software engineers need a common understanding of circuit cutting. In this work, we introduce three patterns focusing on quantum circuit cutting, which describe proven solution strategies as a first step towards providing abstract guidance and fostering a common understanding in this domain. These patterns are integrated into an existing quantum computing pattern language, thereby supporting the comprehension and application of quantum circuit cutting for quantum software engineers and promoting its practical implementation.
Prompt engineering is becoming a critical skill for software developers by facilitating enhanced interactions with conversational large language models (LLMs), such as ChatGPT, Claude, and Gemini. This emerging discipline focuses on crafting prompts, which are instructions that guide LLMs in generating precise outputs, automating tasks, and ensuring adherence to specific qualitative and quantitative standards. Prompts are also a form of natural language programming that tailor the dialogue between users and LLMs, optimizing input, output, and interaction dynamics for many computational tasks, such as developing software, analyzing documents, and/or addressing cyber vulnerabilities. This paper introduces a comprehensive catalog of prompt engineering techniques---structured as a collection of patterns---aimed at addressing common challenges encountered when integrating LLMs into the software development lifecycle. These prompt patterns serve as an effective means for knowledge transfer, similar to software patterns. In particular, they provide reusable solutions to common problems faced in particular contexts, such as output generation and interaction when conversing with LLMs in the domain of software-reliant systems. This paper provides three contributions to research on---and the practice of---prompt engineering for applying LLMs to aid users performing computational tasks. First, it establishes a framework for documenting and deploying prompt patterns across various domains, focusing on enhancing LLM utility in software development endeavors. Second, it curates a catalog of prompt patterns, validated through successful application in refining LLM interactions and outputs. Third, it explores the synergistic potential of creating more complex prompts by combining multiple prompt patterns.
Security patterns offer a time-tested solution for common security issues. Patterns can help organizations develop secure software and achieve compliance with ever-increasing regulations. However, an analysis of the existing literature shows that there is a lack of uniformity when describing security patterns and a lack of an up-to-date catalog, as patterns are spread across multiple papers and publication venues, leading organizations to discard their use. Our work solves these gaps by developing a concise pattern catalog by analyzing over 295 security patterns and filtering them based on quality metrics, as well as the means to expand it further as new security patterns emerge. We also use our catalog to improve the Portuguese national cybersecurity reference board in order to help organizations achieve compliance.
Context: Design patterns are reusable solutions for recurring problems of software design. Although useful for software analysis, detecting design patterns is often challenging especially in large and complex software systems. In this context, several tools have been proposed for automating this process. Objective: Past attempts to summarize existing detection tools contain gaps in their scope, such as the lack of a comparison of the output provided by the tools in terms of precision and agreement. We address some of these gaps through a literature review and a comparison of design pattern detection tools. Our goal is to assist practitioners and researchers not only looking for useful tools, but also exploring opportunities for their improvements. Method: We present a systematic literature review of design pattern detection tools based on strict guidelines. We compare the performance of four tools in detecting six design patterns based on precision, recall, F-measure, and agreement. Results: From the 42 tools found, only ten are available for download. Altogether, the tools detect all 23 design patterns summarized by the Gang of Four's book. The comparison results suggest that some tools are more suitable for specific design patterns, e.g., the FINDER tool for Composite, Decorator and Visitor. We also observed a low agreement among tools. Conclusions: Despite the high number of tools published, design pattern detection tools are mostly ineffective and unavailable for use. Particularly, practitioners might struggle to find a tool that matches their expectations. The available tools provide inaccurate yet complementary detection results; thus, solutions for either improving or combining tools are needed. Researchers are encouraged to propose novel tools capable of filling this literature gap.
Adopting DevOps practices is nowadays a recurring task in the industry. DevOps is a set of practices intended to reduce the friction between the software development (Dev) and the IT operations (Ops), resulting in higher quality software and a shorter development lifecycle. Even though many resources are talking about DevOps practices, they are often inconsistent with each other on the best DevOps practices. Furthermore, they lack the needed detail and structure for beginners to the DevOps field to quickly understand them. In order to tackle this issue, this paper proposes four foundational DevOps patterns: Version Control Everything, Continuous Integration, Deployment Automation, and Monitoring. The patterns are both detailed enough and structured to be easily reused by practitioners and flexible enough to accommodate different needs and quirks that might arise from their actual usage context. Furthermore, the patterns are tuned to the DevOps principle of Continuous Improvement by containing metrics so that practitioners can improve their pattern implementations.