Minneapolis Articles / Blogs / Perficient https://blogs.perficient.com/tag/minneapolis/ Expert Digital Insights Mon, 25 Sep 2023 20:59:10 +0000 en-US hourly 1 https://blogs.perficient.com/files/favicon-194x194-1-150x150.png Minneapolis Articles / Blogs / Perficient https://blogs.perficient.com/tag/minneapolis/ 32 32 30508587 Congratulations to the Detroit and Minneapolis Bright Paths Program Graduates! https://blogs.perficient.com/2022/10/14/congratulations-to-the-minneapolis-and-detroit-bright-paths-program-graduates/ https://blogs.perficient.com/2022/10/14/congratulations-to-the-minneapolis-and-detroit-bright-paths-program-graduates/#respond Fri, 14 Oct 2022 18:13:54 +0000 https://blogs.perficient.com/?p=320383

Our newest Detroit and Minneapolis Bright Paths Program cohorts recently concluded, and Perficient is proud to announce the graduation of 50 dedicated students from the program!

The Bright Paths Program is designed to advance STEM education and career opportunities for underrepresented constituencies and communities, while closing the gap in the technology industry. The latest program featured our third cohort in Detroit and our first in Minneapolis. Courses for our graduating class began in summer 2022.

In partnership with Strayer University’s Hackbright Academy and Devmountain, this fully-funded coding bootcamp allowed students to learn the necessary skills to become entry-level software engineers, quality assurance (QA) testers, and other tech positions upon program completion.

A Graduation Full of Innovation, Ingenuity and Creativity

On this day of celebration and graduation, all 50 graduates showcased the skills they developed throughout the 16-week program by presenting their individual, custom-built applications to an audience of their peers, educators, and Perficient mentors. Each graduate chose a specialized track halfway through the program, and their capstone application project was developed around their specialization and knowledge obtained throughout all 16 weeks.

The graduates’ application presentations were split into five breakout groups:

  1. Web
  2. QA
  3. Data
  4. Java A
  5. Java B

All students came from different backgrounds, many with personal experiences in careers or life that sparked the inspiration to initially apply to the program. With the ability to create a completely custom application, some students took their inspiration further and developed their application around their background, and others showcased personal interests, or even an idea they’ve always dreamt of, but never imagined successfully executing within just 16 short weeks.

Applications during the ceremony ranged from fashion blogging platforms and in-depth storefronts to deep-dive analyses of the impacts COVID-19 has had on marginalized groups in the United States. Other applications included a recipe-sharing platform, healthcare coverage analysis, how music has changed over time, world populations, and seemingly everything in between. As each student presented their work, the knowledge and skills gained from this full-time bootcamp were on full display. For each presentation, comments from Perficient mentors and fellow cohort graduates endlessly praised the impressive work put into each application.

Once the presentations concluded, all attendees gathered again in the main meeting room where multiple speakers commended each graduate for their hard work and commitment, and where graduates received their certification of program completion. Many who spoke in this final portion of the celebration described our Bright Paths Program as “intense, but life-changing and inspiring.”

Words of Wisdom

As graduates embark on a new life journey and career path, it’s important they recognize the weight this achievement holds. Applying to the program and fully immersing into the experience shows the investment each graduate made in choosing to pursue a lifelong career in an ever-evolving, thriving industry.

One of the most repeated pieces of advice in this celebratory conclusion was for graduates to stay on top of and continue advancing their skillsets. There’s always something new to learn, and in order to take ownership of a career in technology, it’s important to be your own biggest cheerleader and challenge yourself to continue growing.

Perficient’s People Promise outlines our commitment to challenge, champion, and celebrate every colleague. Included in that commitment are company-wide initiatives like Growth for Everyone which enables and encourages colleagues to seek out their professional growth. Within these initiatives and promises to our colleagues, there are seemingly endless resources to continue learning, map out careers, and understand the full potential of a career in technology.

Congratulations to our most recent Perficient Bright Paths Program Graduates! The ingenuity, passion, and dedication each student brought throughout the program prevailed in the applications they developed, and we can’t wait to see their career grows in the technology industry and beyond.


READY TO GROW YOUR CAREER?

At Perficient, we continually look for ways to champion and challenge our talented workforce with interesting projects for high-profile clients, encourage personal and professional growth through training and mentoring, and celebrate our people-oriented culture and the innovative ways they serve Perficient and the community.

Visit our Careers page to see career opportunities and more!

Go inside Life at Perficient and connect with us on LinkedInYouTubeTwitter, and Instagram.

]]>
https://blogs.perficient.com/2022/10/14/congratulations-to-the-minneapolis-and-detroit-bright-paths-program-graduates/feed/ 0 320383
Perficient Colleagues Donate $21,047 and 5,624+ Meals to Feeding America During Hunger Action Month https://blogs.perficient.com/2022/10/10/perficient-colleagues-donate-21047-and-5624-meals-to-feeding-america-during-hunger-action-month/ https://blogs.perficient.com/2022/10/10/perficient-colleagues-donate-21047-and-5624-meals-to-feeding-america-during-hunger-action-month/#respond Mon, 10 Oct 2022 17:03:50 +0000 https://blogs.perficient.com/?p=319866

The decision between food and other necessities shouldn’t be an impossible choice, yet food insecurity remains a nationwide issue. According to Feeding America, Feeding Americathe largest hunger relief organization in the U.S., over 38 million people in the U.S., including more than 12 million children, struggle with hunger. 

September was Hunger Action Month (HAM), a campaign sponsored by our community partner Feeding America that seeks to raise awareness and fight food insecurity in the U.S. Our Giving Employee Resource Group (ERG) coordinated several activities throughout the month that invited U.S. colleagues to support Feeding America during HAM.  

By the end of September, Perficient and our colleagues donated $21,047 to Feeding America, provided the equivalent of more than 5,624 meals to communities across the U.S., and volunteered 245.5 hours at local food banks!

Individually, our colleagues are passionate about giving back. Together, we made a real difference. Here’s a recap of just some of the activities that took place at Perficient during the month-long initiative. 

Our “Get to Know” Event with Feeding America 

Our Giving ERG hosts regular events that educate, enable, and engage colleagues in ways to give back. We kicked off the HAM initiative with a virtual “Get to Know Feeding America” event where colleagues heard from representatives from the organization about the essential work they are doing in communities across the country.  

Feeding America Network

Feeding America network courtesy of Feeding America

Feeding America’s mission is to advance change in America by ensuring equitable access to nutritious food for all, and they achieve this by partnering with food banks, policymakers, supporters, and the communities they serve. Their network is comprised of 200 food banks that are connected to more than 60,000 meal programs, which include everything from community soup kitchens and food pantries to programs designed specifically to serve vulnerable populations like seniors and veterans.  

Feeding America serves every county in all 50 states and Puerto Rico, serving more than 40 million people annually. Curious about what hunger looks like in your community? Visit Feeding America’s interactive hunger map to learn more. You can also find your local food bank using their food bank map. 

How We Donated $21,047 to Feeding America 

During a recent Perficient sales conference, attendees could visit a Giving ERG exhibit booth to learn more about the group and the HAM initiative. While there, attendees were invited to make monetary donations to Feeding America and be added to an onsite donation leaderboard – making a difference while earning bragging rights among their peers.  

Colleagues generously opened their wallets to make donations all in the name of connecting people with food and ending hunger. By the end of the two-day event, dozens of colleagues raised an incredible $6,620 to fight food insecurity. Congratulations to these colleagues who topped the leaderboard: Angela Engel, Felicia Johnson, Paul Schoknecht, Stu Huels, and Lori Sackowitz and Kathryn Bogen.  

Minneapolis Volunteers At Second Harvest Heartland 2Feeding America is a Perficient Gives community partner, and the generosity of our colleagues inspired Perficient to make a matching $6,620 donation. In addition, Perficient Chairman and CEO Jeff Davis personally matched the $6,620 donation. Add to that the monthly donations colleagues made through the Perficient Gives charitable match program, and our grand total comes to an incredible $21,047! Every dollar donated to Feeding America helps provide meals to people facing hunger, and we are so proud that the generosity of our colleagues is making an impact.

Our HAM Competition Inspires Nationwide Action and Generosity

Our HAM activities weren’t just limited to virtual learning opportunities and one onsite event. The Perficient Giving ERG hosted a nationwide HAM competition throughout the month of September challenging all U.S. Perficient colleagues to get involved.  

Here are a few of the ways colleagues could make an impact: 

  1. Atlanta Volunteers At Food 4 Life 6Food Donations: During September, all U.S. Perficient office locations acted as temporary food donation centers. Colleagues could bring non-perishable food items to their local Perficient offices for donation to area Feeding America food banks.
  2. Advocacy Emails: Colleagues were invited to use Feeding America’s email templates to contact their political representatives and urge them to take action to end food insecurity.
  3. Volunteer: Colleagues were also encouraged to volunteer their time at a local food bank. Local office liaisons could also organize group volunteer outings to amplify efforts and overall impact.  

Each office received points for every item of food donated, advocacy email sent, and hour spent volunteering. In the end, the two offices with the most points received a prize. Colleagues eagerly embraced the opportunity to make a difference locally, serving as a true testament to the care and generosity found among Perficient’s people.  

St. Louis Volunteers At St. Louis Area Foodbank 4So, what were the results? Queue the drumroll! By the end of HAM, we collectively donated the equivalent of more than 5,624 meals to local food banks across the country. Here’s how the numbers break down: 

  • 4,356 pounds of dry food  
  • 2,560 cans of food 
  • 245.5 hours volunteered 
  • 111 advocacy emails sent 

Our Minneapolis colleagues topped the leaderboard with Lafayette following in second place. Both locations will receive a snack box from Caroo to share with local colleagues. As an added benefit, Caroo makes a donation to Feeding America for every snack box purchased, extending Perficient’s impact even further.  

 As indicated by the results above, colleagues turned out in droves to support HAM. Take a look at the slideshow below to see photos of our colleague’s giving in action. Together with our colleagues and community partners, Perficient is committed to helping those in need and building a better world.

Click to view slideshow.

 


READY TO GROW YOUR CAREER?

At Perficient, we continually look for ways to champion and challenge our talented workforce with interesting projects for high-profile clients, encourage personal and professional growth through training and mentoring, and celebrate our people-oriented culture and the innovative ways they serve Perficient and the community.

Visit our Careers page to see career opportunities and more!

Go inside Life at Perficient and connect with us on LinkedInYouTubeTwitter, and Instagram.

 

]]>
https://blogs.perficient.com/2022/10/10/perficient-colleagues-donate-21047-and-5624-meals-to-feeding-america-during-hunger-action-month/feed/ 0 319866
Megan Jensen Values Building Genuine Connections at Work https://blogs.perficient.com/2022/09/07/megan-jensen-values-building-genuine-connections-at-work/ https://blogs.perficient.com/2022/09/07/megan-jensen-values-building-genuine-connections-at-work/#comments Wed, 07 Sep 2022 16:34:39 +0000 https://blogs.perficient.com/?p=317980

Megan Jensen, senior solutions architect in our award-winning Sitecore practice is passionate about our collaborative culture at Perficient. She’s involved in our Women in Tech ERG, Minneapolis business unit culture events, and the Sitecore community as a Sitecore Strategy MVP. Megan is committed to giving her time, energy, and expertise to her communities, and she discusses her devotion to her work, colleagues, and clients below.

What is your role? Describe a typical day in the life.

Syttende Mai

As a senior solutions architect in Perficient’s Sitecore business unit, I’m like a Swiss army knife doing it all. I have a deep understanding of Sitecore, all the products offered, and how they work together. I find it most rewarding to work with our clients over a longer span of time to learn about their business, get to know their teams well, and become embedded with the work they’re doing to help them succeed.

When our team is brought into a new project, we define the scope and help with everything from user research and content strategy, to usability testing and assisting with SEO. My job is to understand the people who use our clients’ websites, and recognize what they’re trying to accomplish while using it. I use this knowledge to build a user-friendly website that’s easy for people to use and find what they’re looking for. This can include making tweaks to the functionality, information, or design of websites.

What are your proudest accomplishments, personally and professionally? Any milestone moments at Perficient?

I am very proud to be a Sitecore Strategy MVP. I have participated in several speaking engagements at Sitecore user groups, written blogs, spoken on podcasts, helped organize strategy and marketing focused lunches, and stayed active in the Sitecore community to answer questions. Having consistent contributions to the community is something I take pride in.

I’ve also been selected to speak at the Sitecore Symposium in Chicago this year. After attending the Symposium for several years, being chosen to speak on the big stage is thrilling and terrifying at the same time. I’m ultimately excited to share my expertise in front of people that I’ve come to know very well and have a lot of respect for.

It’s been a big year for me professionally, and I’m both grateful and proud. I owe so much to the people I work with at Perficient because I would not have learned so much without the generosity of their time and unfailing patience in answering all my questions. In this industry, you do not get anywhere without the help of others.

READ MORE: The Power of Sitecore Specialization at Perficient – Our People

What has your experience at Perficient taught you?

It has simultaneously taught me humility and confidence. There is always more to learn, and that’s where humility comes into play. Everything is always evolving, and just when you think you have a handle on something, there’s a new release, version of a product, or a completely new product to learn.

Cooking

Megan cooking

My experience at Perficient has also taught me confidence. I’ve struggled with imposter syndrome, but having people above me ask for my opinion because they trust me has really boosted my confidence. Our developers treat strategists as equals because we both know that we need each other in order to be successful on projects.

What advice would you give to colleagues who are starting their career with Perficient?

Do not hesitate to ask questions, and always implement the 15-minute rule. The 15-minute rule allows 15 minutes trying to figure something out, but if it takes any longer than that, you should ask someone for help because your time is too valuable. Whether it’s connecting to the printer or understanding why your AB test isn’t triggering correctly, there’s no shame in asking your colleagues for support. They’ll likely be flattered that you asked, and no one has ever thought less of me for asking questions. I think the greatest gift is teaching each other what we’ve learned because it makes us better collectively.

How have you grown your career with Perficient?

Jensen Girls

Megan’s two daughters

I’ve done my homework by reading and watching tutorials. I always try to be one step ahead and know the answers that could possibly help so, if I’m in a meeting, I’m always prepared. I proactively learn new things and try to stay ahead. This approach has taken me pretty far in my career. I also find it’s important to network and market yourself. Personally, I’m very involved with our Women in Tech ERG and the Minneapolis business unit, and this has enhanced project delivery by already having personal connections with people.

What are you passionate about outside of work?

I love spending time with my husband and two daughters, and as a family, we enjoy attending concerts together. I’m really into live music, and I have the time of my life watching cover bands at dive bars. I’m also a bit of a foodie, so I like to cook and go out to eat, but I also am politically active and do a lot of volunteering.

What is one thing you wish your colleagues knew about you?

I hope my colleagues know how much I care about them. I genuinely worry when they go through hard times in their personal lives, and I truly mean it when I say that I’m thinking about them. The Sitecore and Minneapolis business unit colleagues are my people, and it makes such a huge difference working with your friends. Perficient is full of smart people, and I am proud and grateful to be a member of this team.


SEE MORE PEOPLE OF PERFICIENT

It’s no secret our success is because of our people. No matter the technology or time zone, our colleagues are committed to delivering innovative, end-to-end digital solutions for the world’s biggest brands, and we bring a collaborative spirit to every interaction. We’re always seeking the best and brightest to work with us. Join our team and experience a culture that challenges, champions, and celebrates our people.

Visit our Careers page to see career opportunities and more!

Go inside Life at Perficient and connect with us on LinkedIn, YouTube, Twitter, Facebook, and Instagram.

]]>
https://blogs.perficient.com/2022/09/07/megan-jensen-values-building-genuine-connections-at-work/feed/ 1 317980
Minneapolis Colleagues Raise Money for Back to School Supplies https://blogs.perficient.com/2022/09/02/minneapolis-colleagues-raise-money-for-back-to-school-supplies/ https://blogs.perficient.com/2022/09/02/minneapolis-colleagues-raise-money-for-back-to-school-supplies/#respond Fri, 02 Sep 2022 16:21:46 +0000 https://blogs.perficient.com/?p=317713

This year families will spend an average of $864 on back to school supplies, according to the National Retail Foundation. With inflation rising, one-third of consumers are having to cut back spending in other areas in order to afford these supplies. Teachers are often forced to buy their own supplies even though they make 21.4% less than their similarly educated peers.

Minneapolis Colleagues Give Back

Recently, our Minneapolis colleagues rallied the office to give back to their community schools. During the month of August they raised $1,100 to purchase school supplies. The team bought backpacks, notebooks, pencils, and items needed for classrooms. Our colleagues then donated the items to the Minneapolis Public Schools.

“I think of the Back to School event similarly to how we as consultants need certain tools up front to be to be successful on projects. It is the same for students in Minneapolis Public Schools. They need to have the supplies needed to start the year off towards success. All students need their own pencils, folders, paper, crayons, and calculators to be able to participate fully in their education and build their knowledge. Knowing that I can contribute to classrooms in this small way fills my cup.”

– Lyndsey Ruhland, lead business consultant

Click to view slideshow.

An Award Winning Culture

Our team in Minneapolis truly has an outstanding culture. They have been named a Top Workplace by the Minneapolis Start Tribune 9 times. And a lot of what drives that culture to be so great is their spirit of giving back. This year, we announced a new Bright Paths Program cohort in Minneapolis. The Bright Paths Program is advancing STEM education and career opportunities while helping to close the employment gaps that exist in the tech industry, especially among women and minorities.

The team has also been huge supporters of Technovation, a program that teaches girls the skills they need to change the world with technology. They’ve supported Toys for Tots and participated in Paint-A-Thons. But they also take pride in having a great working relationship with their colleagues.  Over the years they’ve done boat cruises, picnics, apple picking, and holiday parties to garner team spirit. And they’re not stopping anytime soon yet!


JOIN AN AWARD-WINNING WORKPLACE

At Perficient, we continually look for ways to champion and challenge our talented workforce with interesting projects for high-profile clients, encourage personal and professional growth through training and mentoring, and celebrate our people-oriented culture and the innovative ways they serve Perficient and the community.

]]>
https://blogs.perficient.com/2022/09/02/minneapolis-colleagues-raise-money-for-back-to-school-supplies/feed/ 0 317713
Applying Bright Paths Knowledge: Five Program Graduates Discuss Their Custom Applications https://blogs.perficient.com/2022/05/10/applying-bright-paths-knowledge-five-program-graduates-discuss-their-custom-applications/ https://blogs.perficient.com/2022/05/10/applying-bright-paths-knowledge-five-program-graduates-discuss-their-custom-applications/#respond Tue, 10 May 2022 14:15:12 +0000 https://blogs.perficient.com/?p=309413

Our Bright Paths Program is designed to advance STEM education and career opportunities for underrepresented constituencies and communities while closing the gap in technology.

Perficient created Bright Paths in partnership between Perficient and Strayer University’s Hackbright Academy, a coding bootcamp and engineering program designed for women, as well as Devmountain, a design and coding bootcamp designed to equip students with the skills to start their journey toward a career in tech. The program is currently accepting applications for individuals in Detroit and Minneapolis who are ready to learn the skills needed for entry-level work in software engineering, quality assurance (QA) testing, data analysis, or web development.

We previously looked at why three graduates applied to the program, and most recently heard four pieces of advice to incoming Bright Paths students. For the final blog of the series, we will discover what possibilities lie within Bright Paths by seeing what technical stacks five students learned and utilized to develop custom applications.

Full Stack Blackjack

Rob Lewis

Rob Lewis, Detroit Bright Paths graduate and associate technical consultant at Perficient not only turned his interest in coding into a career, he used his blackjack hobby as the inspiration for his custom app development.

“I love making games, and I found an interesting way to include all the project requirements in this game,” said Rob. His application, Full Stack Blackjack, incorporates HTML and JavaScript (NodeJS) to allow users to play Blackjack. Rob added that Full Stack Blackjack “applies all the standard casino rules, and if the player wishes to do so, they’re able to ‘bank’ their winnings to reload in the next session.”

Helping Hands

Daravy DeRouen

When quarantined with COVID-19, Daravy DeRouen, Lafayette Bright Paths graduate and Perficient associate technical consultant, found that her loved ones were eager to support her, saying “My family constantly helped with my children, food, and pets.”

This sparked an idea for Daravy to develop an app during the Bright Paths bootcamp called Helping Hands using the MERN Stack, which includes MongoDB, ExpressJS, ReactJS, and NodeJS. Using the knowledge she gained from the program, Daravy’s application “allows users to post tasks with their specific location that need to be completed. Other users can then volunteer to pick up these tasks by checking a green mark.”

Website For a Local Business

Adam Ray

Adam Ray, Lafayette Bright Paths graduate and Perficient associate technical consultant, saw his Bright Paths project as the perfect opportunity to create a website for a local business. “After looking at the existing website that was created decades ago, I saw an opportunity to better showcase the company by modernizing the website and incorporating additional features for a smoother user interface,” said Adam. “I utilized React, JavaScript, CSS, HTML, and Firebase to allow customers and employees to quickly and effectively use the website.”

Video Game Market Analysis

Steven Epstein

A video game fan, Steven Epstein, Detroit Bright Paths graduate and associate technical consultant at Perficient, sought to create a custom app that compares the video game consoles currently available and evaluates the sales by genre to see which console is statistically better. “I created a video game market analysis application using Python, specifically the Panda and matplotlib.pyplot libraries,” said Steven. For proper analysis of the data, Steven explained, “I analyzed a .csv file with data, and displayed the information and charts using Jupyter Notebook. I also refactored the code into functions with docstrings so it could be reused and compared to other consoles.”

Contacted

Karam Nasser

Karam Nassar, Detroit Bright Paths graduate and Perficient associate technical consultant, created an application titled “Contacted” that helps individuals and influencers alike. “Think of this application like a business card, but for the individual’s personal platforms,” he explained. “My application encompasses individual contact information, and links to social media platforms, bios, and even personal websites.” To develop this user-friendly, completely customizable application, Karam used HTML, CSS, and JavaScript.


READY TO GROW YOUR CAREER?

Interested in enhancing your technical skillsets and developing your own custom app? Perficient’s Bright Paths Program could be the perfect opportunity for you. If you or someone you know aspires for a career in tech, we’re currently accepting applications for our upcoming Bright Paths Program in Detroit and Minneapolis. The application window closes May 10, and classes begin June 20.

At Perficient, we continually look for ways to champion and challenge our talented workforce with interesting projects for high-profile clients, encourage personal and professional growth through training and mentoring, and celebrate our people-oriented culture and the innovative ways they serve Perficient and the community.

Visit our Careers page to see career opportunities and more!

Go inside Life at Perficient and connect with us on LinkedInYouTubeTwitter, and Instagram.

]]>
https://blogs.perficient.com/2022/05/10/applying-bright-paths-knowledge-five-program-graduates-discuss-their-custom-applications/feed/ 0 309413
Four Pieces of Advice to Incoming Bright Paths Students https://blogs.perficient.com/2022/05/03/four-pieces-of-advice-to-incoming-bright-paths-students/ https://blogs.perficient.com/2022/05/03/four-pieces-of-advice-to-incoming-bright-paths-students/#respond Tue, 03 May 2022 20:36:18 +0000 https://blogs.perficient.com/?p=309008

Hear advice from five Bright Paths Program graduates, now Perficient colleagues.

Our Bright Paths Program is designed to advance STEM education and career opportunities for underrepresented constituencies and communities while closing the gap in the technology industry. The program is currently accepting applications for the next two cohorts in Detroit and Minneapolis, with qualified program graduates receiving job offers from Perficient to kickstart their career in tech.

This is the second blog of a three-part series giving an inside perspective of our Bright Paths Program, told directly from recent Bright Paths graduates. Previously, the series looked at why three Bright Paths graduates applied to the program. This week, we will hear from five graduates, who are now Perficient colleagues, to understand what advice they would offer to incoming Bright Paths students.

Fully Embrace the Process

Adam Ray

The Bright Paths Program is a 16-week bootcamp where students learn the necessary skills to become entry-level software engineers – for free. Throughout the program, students learn and grow their skillsets to start a new journey in life. Recognizing the weight these 16-weeks hold, Bright Paths graduates have offered beneficial advice to incoming students to keep in mind throughout their experience.

A common theme throughout the advice focuses on the learning process itself. Attending a custom coding bootcamp is exciting, but requires “a firm dedication to learning, knowing it could be difficult, and really embracing the struggle,” said Adam Ray, Lafayette, La., Bright Paths graduate and associate technical consultant at Perficient. “Setting a consistent time management strategy is paramount to optimize your work-life balance during the program.”

Understand Mistakes Happen

Steven Epstein

When learning a new set of skills, it’s important to understand the power of failing fast and succeeding faster because of it. “Test often. Mistakes are part of the job, it happens,” said Steven Epstein, Detroit Bright Paths graduate and Perficient associate technical consultant. “The sooner mistakes are detected, the easier they are to fix.”

Many Bright Paths students are new to the field of software engineering and development, which can be intimidating and uncomfortable at times. However, challenging situations are also opportunities for growth. Pushing yourself to lean into what seems uncomfortable enhances the overall process and end results.

 

Be Patient with Yourself

Karam Nasser

One common piece of advice from program graduates is to understand that the entire process is a marathon and not a sprint. As one Bright Paths graduate and Perficient associate technical consultant put it, “Remember to be patient with yourself throughout the learning process.” To add to this, Detroit Bright Paths graduate and Perficient associate technical consultant, Karam Nassar recommended “Working as hard as possible and controlling your thoughts. It’s important to trust yourself and the Bright Paths process.”

Overcome Imposter Syndrome

Going into the program, students are met with a wealth of material waiting to be learned and new, unfamiliar career opportunities that lie ahead. That realization can be daunting and could lead to self-doubt and imposter syndrome. Bright Path students must realize they are in the program because of their own ambition and drive to grow. The knowledge students gain from the successes and challenges along the way is what allows them to make the most of their experience.

Daravy DeRouen

When going through the process, “Recognize the smallest progress, because at the end, it all adds to be one big finale,” said Daravy DeRouen, Lafayette Bright Paths graduate and Perficient associate technical consultant. “I went from knowing nothing, to gaining a wealth of knowledge by the end of the bootcamp. Don’t be too hard on yourself. It’s challenging, but you will make it!”

These graduates elaborate on the effort it took for them to complete the 16-week bootcamp, but many explain it’s important to trust the process and yourself. Going through Bright Paths and fully embracing everything that comes with it shows the value placed on investing in your own future.


READY TO GROW YOUR CAREER?

Whether you’re interested in pursuing a career change, turning a hobby into a career, or looking to enhance your technical skillsets, Perficient’s Bright Paths Program could be the perfect opportunity for you. If you or someone you know aspires for a career in tech, we’re currently accepting applications for our upcoming Bright Paths Program in Detroit and Minneapolis. The application window closes May 10, and classes begin June 20.

Stay tuned for the final blog of this three-part series to see what possibilities lie within the program by learning about the custom applications students developed prior to graduation.

At Perficient, we continually look for ways to champion and challenge our talented workforce with interesting projects for high-profile clients, encourage personal and professional growth through training and mentoring, and celebrate our people-oriented culture and the innovative ways they serve Perficient and the community.

Visit our Careers page to see career opportunities and more!

Go inside Life at Perficient and connect with us on LinkedInYouTubeTwitter, and Instagram.

]]>
https://blogs.perficient.com/2022/05/03/four-pieces-of-advice-to-incoming-bright-paths-students/feed/ 0 309008
Three Bright Paths Graduates Explain Why They Applied to the Program https://blogs.perficient.com/2022/04/22/three-bright-paths-graduates-explain-why-they-applied-to-the-program/ https://blogs.perficient.com/2022/04/22/three-bright-paths-graduates-explain-why-they-applied-to-the-program/#respond Fri, 22 Apr 2022 18:49:37 +0000 https://blogs.perficient.com/?p=308578

Interested in a career in tech? Consider applying to Perficient’s Bright Paths Program.

At Perficient, we’re committed to bringing more diverse insights and skillsets into the conversation to drive true innovation forward. Our Bright Paths Program is designed to advance STEM education and career opportunities for underrepresented constituencies and communities while closing the gap in the technology industry. We’re proud to offer this program for individuals to pursue careers in tech who may not otherwise have access. To date, 67 Bright Paths graduates have joined Perficient in the software engineering and development field.

Are you or someone you know interested in a career in tech? We’re currently accepting applications for the next two cohorts in Detroit and Minneapolis launching in June.

To learn a bit more about Bright Paths from an insider’s point of view, we are publishing a three-part blog series inspired by our second Bright Paths Program graduates, now Perficient colleagues. In this first blog of the series, we will learn how some colleagues got involved in the program and why they decided to apply.

Changing Career Paths

Daravy DeRouen

The Bright Paths Program offers more than new opportunities – it brings new beginnings. Lafayette, La., Bright Paths Program graduate, Daravy DeRouen, saw Bright Paths as an opportunity to grow and initiate change in her life. Daravy had a hard fight with COVID-19 and had just gotten out of isolation when she saw an ad for the Bright Paths Program. She stated, “I promised myself if I made it through COVID, I would start a new chapter. Do something that truly inspires me and makes me happy every day. When I saw the ad, I knew this was the perfect opportunity to start that chapter.”

Now an associate technical consultant at Perficient, Daravy is training to become an Appian developer. “Bright Paths provided a great foundation for my first role in the tech industry,” said Daravy. “I now have an endless amount of learning at my fingertips, and I am constantly growing as an individual and a team member.”

Turning Hobbies to Careers

For some, Bright Paths opens a door to an unfamiliar, yet exciting world of new opportunities. For others, Bright Paths is the perfect opportunity to turn a hobby or passion into a lifelong career in technology.

Steven Epstein

“I enjoyed playing with technology, and knew I’d like working with technology,” said Steven Epstein, Detroit Bright Paths Program graduate and associate technical consultant at Perficient. “I liked that continuing education wasn’t just encouraged, it was actively supported by Perficient. Having mentors from Perficient as I worked through the bootcamp and when I started working seemed like a great way to ease into my new position – and it was!”

 

Bright Paths students attend a 16-week custom coding bootcamp designed to grow their skills, but the learning doesn’t stop when the program ends. Graduates who become Perficient colleagues have several resources available to continue growing their skills and knowledge throughout their careers.

Enhancing Skillsets

People apply to Bright Paths to establish or grow their software talent. Such was the case for one program graduate, now a Perficient associate technical consultant.

“I have previous experience in the industry but wanted to re-enter with additional technical skills,” the student said. “While searching for opportunities to enhance my skillset, I discovered the Bright Paths Program and decided to apply.”

Throughout the custom coding bootcamp, students learn a wide variety of coding programs. This student specifically learned HTML, CSS, JavaScript, Express, and Axios – which they used to build a custom application at the end of the 16 weeks.


READY TO GROW YOUR CAREER?

Whether you’re interested in pursuing a career change, turning a hobby into a career, or looking to enhance your technical skillsets, Perficient’s Bright Paths Program could be the perfect opportunity for you. If you or someone you know aspires for a career in tech, we’re currently accepting applications for our upcoming Bright Paths Program in Detroit and Minneapolis. The application window closes May 10, and classes begin June 20.

Stay tuned for the next two blogs of this three-part series to learn what advice graduates would give to incoming Bright Paths students, and see what possibilities lie within the program by learning about the custom applications they developed.

At Perficient, we continually look for ways to champion and challenge our talented workforce with interesting projects for high-profile clients, encourage personal and professional growth through training and mentoring, and celebrate our people-oriented culture and the innovative ways they serve Perficient and the community.

Visit our Careers page to see career opportunities and more!

Go inside Life at Perficient and connect with us on LinkedInYouTubeTwitter, and Instagram.

]]>
https://blogs.perficient.com/2022/04/22/three-bright-paths-graduates-explain-why-they-applied-to-the-program/feed/ 0 308578
A tour of PowerQuery’s M language https://blogs.perficient.com/2022/04/22/a-tour-of-powerquerys-m-language/ https://blogs.perficient.com/2022/04/22/a-tour-of-powerquerys-m-language/#respond Fri, 22 Apr 2022 14:43:02 +0000 https://blogs.perficient.com/?p=308564

In a previous post, I introduced PowerQuery and demonstrated how to perform various SQL-like operations. This article gives a tour of PowerQuery’s M language that underlies each query.

let and in

If you select a query and click on the “Advanced Editor” button in the Home tab, you’ll see something like this:

Image 20220421150214466

This is the M language code that constitutes our query. We’ll soon come back to the above code, but for now, let’s gain a basic understanding of how M works.

The first thing to know about M is that most M scripts are of the form let ... in .... In such a script, intermediate computations happen inside the let statement, and the content after in is the script’s return value.

For example, when the M code

let
     x = 3,
     y = x + 5
in
     y

is the script underlying a query, then that query appears as follows in the GUI:

Image 20220421103907452

Interestingly enough, it is not actually necessary for a script to contain the keywords let and inSo long as the only content in the script evaluates to a value. For instance,

x = 5

is a perfectly valid M script!

So, it is more accurate to say that

  • The contents of every M script must evaluate to a value.

  • let ... in ... evaluates the content after in. Therefore, since let ... in ... evaluates to a value, any script may be of the form let ... in ... .

We should also note that one can place the code of the form x = let ... in ... within any existing let block, and then make use of x!

let ... in ... Vs. select ... from ...

In my opinion, the let ... in ... syntax doesn’t really make much sense. I think the M language would make much more sense if there were no let nor inAnd every script simply returned the value of its last line.

It seems to me thatlet ... in ... is supposed to evoke connotations with SQL’s select ... from .... Comparisons between let ... in ... and select ... from ... quickly break down, though:

  • The data source in a SQL query is specified in the from clause, while the data source of a let ... in ... statement typically appears in the let clause.

  • The result set of a SQL query is determined primarily from the select clause, while the result of a let ... in ... statement is whatever comes after in.

 

 

Autogenerated M code

Now that we have some knowledge about let ... in ...We can look at some sample M code that is autogenerated after using the GUI to create a query:

let
     Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
     #"Changed Type" = Table.TransformColumnTypes(Source,{{"col1", Int64.Type}, {"col2", type text}, {"col3", type text}}),
     #"Filtered Rows" = Table.SelectRows(#"Changed Type", each [col1] = 1 or [col2] = "b")
in
     #"Filtered Rows"

Looking closely at the above code teaches us two important facts about the M language:

  1. Variable identifiers can be of the form #"{string}", where {string} is any string of characters.

  2. The autogenerated M code corresponding to each “step” in a PowerQuery query references the previous step. (E.g., when computing #"Changed Type", we pass Source to Table.TransformColumnTypes()).

If we consult the M documentation for any of the functions (Excel.CurrentWorkbook(), Table.TransformColumnTypes(), Table.SelectRows()) in the above, we also see that

  1. The objects that represent each “step” in a query are of type table.

M data types

  • The Microsoft documentation describes M as having the following primitive types: binary, date, datetime, datetimezone, duration, list, logical, null, number, record, text, time, type.

  • There are also “abstract types”: function, table, any, and none.

  • Types in M can be declared as nullable.

  • Some types represent types ( type number and type text are such types).

Lists and records

In M, the basic collection types are lists and records. Lists and records are 0-indexed.

Lists are essentially “arrays”, and records map string-valued “keys” to “values.” (So records are essentially “dictionaries”/”hashmaps”).

To initialize a list, use code such as lst = {1, "a", 2, false}. To initialize a record, use code such as rec = [key = 1, key2 = "blah"]. To access the ith element of a list, use lst{i}. To get the value associated with key key (e.g. key = "key1") in a record rec, use rec[key].

M uses functional programming

In M, we use functional programming constructs in the place of looping constructs. The go-to functional programming construct is the function List.Transform(). Given a list lst and a function fn, List.Transform(lst, fn) returns the list that is the result of applying fn to each element of lst.

The function List.Generate() can also be handy. Whenever you can’t think of a good way to solve your problem by using List.Transform()And whenever it is actually best to essentially implement a for loop, use this code to do so:

List.Generate(() => 0, each _ < n, each _ + 1, {statement})

It will execute {statement} n times.

User-defined functions

Writing user-defined functions in M can prove very useful. In my work, I found that I needed to repeat a certain sequence of steps many times. If I were to manually rewrite these steps with the PowerQuery GUI repeatedly, I would drive myself insane and have way too many PowerQuery steps. But, since I created a user-defined function to perform the above task, I was able to perform collapse the above four steps into a single step!

The syntax for defining a custom function uses anonymous function syntax.

fn = (x) => x * x

(If you were to evaluate fn(x) elsewhere in the script, that invocation fn(x) would return x * x).

The query whose M script is the above looks like this in the GUI:

Image 20220421120442467

Global variables and global functions

When a variable or function is used multiple times in multiple scripts, it is best practice to separate the definition of the variable or function from all of the scripts that use the variable or function. To define a global variable with a value of, say, 5, use the Advanced Editor* to make a query’s M code

5

Then, change the name of the query to be the desired identifier for the variable.

Since functions are variables of type function, the process for defining a global function is the same. For example, to declare a global function named fn that sends x to x * x, create a query whose name is fn, and edit the query’s M code with the Advanced Editor* so that it is

(x) => x * x

* If you use the smaller editor instead of the Advanced Editor, you will have to prepend an equals = to the beginning of your code to avoid errors.

Accessing the “current” table row

Recall that the function call that implements the equivalent of a general where clause looks something like

Table.SelectRows(#"Changed Type", each [col1] = 1)

There are a several concepts at play here we glossed over before that deserve explanation.

  • Rows of tables are represented as records. If row is a record that represents some row of a table, the value in the column row of that row is row[col].

  • The second argument of Table.SelectRows() is a function whose input is a record that represents the “current row” of the table and whose output is a logical (i.e. a boolean) that indicates whether or not to include the current row in the result set.

  • _ is a valid variable name in M, and so the function (_) => fn(_) is the same as the function (x) => fn(x) . For example, the function (_) => _ * _ is the same as the function (x) => x * x.

  • The each keyword is shorthand for the syntax(_) =>.

  • Whenever a variable var appears in square brackets to the right of an each, M interprets [var] as meaning _[var]. Therefore, an expression such as each [var] is the same (_) => _[var].

Knowing all of these things, we see that the above code translates to

Table.SelectRows(#"Changed Type", (_) => _[col1] = 1)

Since you might be uncomfortable with using _ as a variable, let’s consider another equivalent function call:

Table.SelectRows(#"Changed Type", (row) => row[col1] = 1)

Here, we understand (row) => row[col1] = 1 to be the function that takes in a record representing the current row, looks at the value in this record associated with the key col1, and returns true whenever that value is equal to 1. Thus, the above code selects the rows from the table that have a value in column col1 of 1.

]]>
https://blogs.perficient.com/2022/04/22/a-tour-of-powerquerys-m-language/feed/ 0 308564
Data exploration with PowerQuery https://blogs.perficient.com/2022/04/22/data-exploration-with-powerquery/ https://blogs.perficient.com/2022/04/22/data-exploration-with-powerquery/#respond Fri, 22 Apr 2022 14:29:53 +0000 https://blogs.perficient.com/?p=308553

Microsoft’s PowerQuery is a neat tool that allows one to perform SQL-like operations on Excel tables.

When investigating a database, I actually prefer using PowerQuery over raw SQL for a couple reasons:

  • PowerQuery displays result sets that are much easier to look at than the a typical SQL plaintext result set.

  • It’s easy to immediately interact with PowerQuery result sets by using the graphical user interface.

  • Most importantly, you write PowerQuery queries one step at a time and can therefore easily sanity check a query as you write it. (It’s tedious to do so in raw SQL).

If you frequently use SQL to investigate databases, I highly recommend that you try out PowerQuery.

To try PowerQuery out on some test data, just create an Excel Table*, then select any cell within that Table, go to the Data tab at the top of the screen, and click “From Table/Range”. (* To create an Excel Table: enter some random data into a rectangular range of cells, then select any cell within that range, go to the Insert tab at the top of the screen, and click “Table”).

Here’s what happens if I have the following Excel Table:

Image 20220421090512615

After I select a cell from the above table, and click “From Table/Range”, the PowerQuery editor pops up:

We can see that PowerQuery has represented my Excel Table as a query. We can also see the graphical user interface that allows us to interactively add steps to said query.

PowerQuery equivalents to SQL constructs

It’s instructive to think about how we can accomplish various SQL constructs within PowerQuery.

  • To do the equivalent of a select statement, and select a subset of columns from the result set, we would click on the “Choose Columns” button (visible above).

  • To do a select distinct, we use “Choose Columns” to execute the desired select, and then, in the following result set, select all columns, right click, and select “Remove Duplicates”.

  • Accomplishing the equivalent of a where clause- selecting the subset of rows from the result set for which a certain condition is true- is a bit hacky in general. (We describe how to do this later). In the case when the condition only involves one column, though, we can do everything in a non-hacky way. If we want to filter the above result set for with col1 = 1, we would click the downwards arrow inside the col1 header, and use either the “Number Filters” option or the checkbox next to “1” in the following menu:

    Image 20220421091644894

  • To do a group by, we go to the Transform tab at the top of the screen, and click “Group By”.

  • To do a join (whether inner, left, right, full outer, etc.), we click “Merge Queries” from within the Home tab. To do a union, we click “Append Queries” from within the Home Tab.

    • To increase encapsulation, one can use the “Merge Queries as New” or “Append Queries as New” options to produce a table that is the result of joining or unioning two existing tables.

      Image 20220421093022520

General where clauses

Above, we noted that accomplishing a where clause that involves more than one column is a bit hacky. We describe how to write such a where clause here. It’s really not that bad: first, just click the downwards arrow inside any column’s header, and filter for anything you like. I’ve done so, and filtered the above data for rows with col1 = 1:

Image 20220422081254808

Notice the code that appears in the bar that runs horizontally over the top the table:

= Table.SelectRows(#"Changed Type", each [col1] = 1)

This code provides a more low-level description of what the “Filtered Rows” step of the query is doing. You can probably guess how we accomplish a general filter (one that involves columns other than col1). If we wanted to change the filtering condition to, say, col1 = 1 or col2 = "b", then what we do is edit said code to be

= Table.SelectRows(#"Changed Type", each [col1] = 1 or [col2] = "b")

It works! We get

Image 20220422081358076

In general, any column of the table can be referenced in an “each statement” such as the above by enclosing the column name in square brackets. Soon, we’ll learn more about what this square bracket notation actually means, and why it must come after the keyword each.

]]>
https://blogs.perficient.com/2022/04/22/data-exploration-with-powerquery/feed/ 0 308553
Perficient Expands Bright Paths Program Cohorts in Detroit and Minneapolis https://blogs.perficient.com/2022/04/01/perficient-expands-bright-paths-program-cohorts-in-detroit-and-minneapolis/ https://blogs.perficient.com/2022/04/01/perficient-expands-bright-paths-program-cohorts-in-detroit-and-minneapolis/#respond Fri, 01 Apr 2022 19:37:28 +0000 https://blogs.perficient.com/?p=306922

Award-Winning Program Advances STEM Education and Career Opportunities to Underserved Communities and Constituencies

Perficient is a company of more than 6,500 diverse and immensely capable colleagues, and we understand the importance of supporting the professional development of our global community.

One of the ways we’re pursuing inclusion and equity in our company and communities is through Perficient Bright Paths. Created in late 2020, our Bright Paths Program is advancing STEM education and career opportunities while helping to close the employment gaps that exist in the tech industry, especially among women and minorities.

To date, 67 Bright Paths students have joined Perficient in the software engineering and development field. Today, we’re proud to announce that the Bright Paths Program is expanding with new cohorts in Detroit and Minneapolis, focusing on advancing diversity in technology.

Those interested in applying for the Perficient Bright Paths Program can learn more and find applications here.

READ MORE: Congratulations to the Recent Perficient Bright Paths Graduates

You can learn the skills to become a software engineer for free!

Perficient has developed the custom bootcamp in partnership with Strayer University’s Hackbright Academy, a coding bootcamp and software engineering program designed for women, and DevMountain, a design and coding bootcamp specifically designed to equip minority students from underrepresented communities with the skills to start their journey toward a career in technology. Perficient proudly funds the Bright Paths Program to provide education and career opportunities to ambitious and deserving individuals who otherwise might be unable to pursue them.

Through our partnership, we’ve developed a 16-week custom bootcamp designed to prepare students for the workforce and study in-demand programs like Java, Python, QA, and Data. During the first eight weeks of the program, students will complete coursework focusing on the foundational concepts of coding. Students will then be able to choose a specialty focus track and develop their own application during the second eight weeks of the program. Additionally, students can expect to meet various leaders from across Perficient who will give them an inside look at the consulting business. Students will also be paired with Perficient mentors who will help guide them through the program.

By the end of the 16-week program, Perficient’s goal is to extend qualified graduates a job in the software engineering and development field, where the new colleagues will have opportunities to partner with the world’s largest enterprises and biggest brands.

READ MORE: See other Bright Paths articles here

Ready to grow your career?

We’re thrilled to bring the Bright Paths Program to Detroit and Minneapolis, and we can’t wait to see each cohort’s curiosity, innovation, and professional development unfold. Anyone interested in pursuing a career in technology is encouraged to apply for the Bright Paths Program.

At Perficient, we continually look for ways to champion and challenge our talented workforce with interesting projects for high-profile clients, encourage personal and professional growth through training and mentoring, and celebrate our people-oriented culture and the innovative ways they serve Perficient and the community.

Learn more about what it’s like to work at Perficient at our Careers page. See open jobs or join our talent community for career tips, job openings, company updates, and more! Go inside Life at Perficient and connect with us on LinkedIn, YouTube, Twitter, and Instagram.

]]>
https://blogs.perficient.com/2022/04/01/perficient-expands-bright-paths-program-cohorts-in-detroit-and-minneapolis/feed/ 0 306922
Dependency injection in C# .NET https://blogs.perficient.com/2022/03/21/dependency-injection-in-c-net/ https://blogs.perficient.com/2022/03/21/dependency-injection-in-c-net/#respond Mon, 21 Mar 2022 20:02:34 +0000 https://blogs.perficient.com/?p=306533

I’ve decided to write a tutorial on how to accomplish dependency injection in C# .NET, because the Microsoft documentation of dependency injection libraries is unfortunately way too sparse, and the Microsoft dependency injection tutorial is a little convoluted and complicated.

Fortunately, C# .NET’s implementation of dependency injection is pretty straightforward. In my opinion, it’s way more straightforward than the implementation provided by Java’s Spring Framework. If you understand the basics of the dependency injection concept but haven’t yet tried it out in practice, C# .NET could be your best bet.

Dependency injection recap

Here’s a quick recap on what dependency injection entails. If you want more detail, this article I wrote may be helpful.

In general, whether dependency injection is in play or not, classes may specify types- called dependencies– that they have has-a relationships with.

In dependency injection, instances of classes are not responsible for creating instances of their dependencies. Instead, a managing container maintains has-a relationships with instances of the classes, and the user specifies to the container which implementations of the dependencies they want to use by calling one of the container’s methods, or by writing so-called “configuration code” that is interpreted by the container. At runtime, the container “injects” these implementations into the class instances.

Why use dependency injection? The main point is to separate interface from implementation. Why is this important? I suggest you read the linked article above for more details.

.NET dependency injection terminology

The first thing to be aware of when learning dependency injection in C# .NET is that Microsoft uses some alternative terminology when discussing dependency injection concepts. If you want to be able to understand the Microsoft documentation, you need to be aware of this terminology. So, here’s some vocabulary:

Microsoft phrase Meaning
service dependency
service registration the storing of dependencies in the managing container
service resolving the injection at runtime of a dependency

ServiceDescriptor

The ServiceDescriptor class is what represents a service (recall that “service” means “dependency”). The most down-to-earth constructor of ServiceDescriptor is as follows:

public ServiceDescriptor (Type serviceType, Type implementationType, ServiceLifetime lifetime)

So, we see that in C# .NET, a service essentially wraps the type of the dependency, the type of the preferred implementation for said dependency, and the “lifetime” of the dependency.

ServiceLifetime

In my opinion, “lifetime” should really be called “instantiation multiplicity”, since the value of lifetime in the above constructor determines whether or not the management container is to create multiple instances of the dependency, and, if so, how to do so.

Specifically, ServiceLifetime is an enum that can take on the value Singleton, Transient, or Scoped.

  • Singleton indicates that the management container (which we have not seen yet) will ensure that only one instance of the service will be created throughout the program lifetime. All class instances which depend on the service will share the same service.

  • Transient indicates that the management container will ensure that a new instance of the dependency will be created whenever a different class instance needs it.

  • The meaning of Scoped is a little complicated for a first pass at dependency injection in C# .NET. If you want to learn about it, read this.

ServiceDescriptor properties

You already saw the ServiceDescriptor constructor, which is what’s most important in regards to understanding ServiceDescriptor. For a bit more detail, here are the public properties that are wrapped by the ServiceDescriptor:

public Func<IServiceProvider,object>? ImplementationFactory { get; } // a factory method that stores instructions on how to build an instance of the implementation type
public object? ImplementationInstance { get; }
public Type? ImplementationType { get; } // type of the wrapped instance, ImplementationInstance
public ServiceLifetime Lifetime { get; }
public Type ServiceType { get; } // type of the wrapped interface

Some of the above may be confusing, so here are some clarifying notes:

  • Func<T1, T2> represents a function that takes an argument of type T1 as input and returns a type T2 instance as output. Thus, the ImplementationFactory property is a function that takes an IServiceProvider as input and returns an instance of the implementation as output. ImplementationFactory can be thought of as wrapping instructions for how to create an instance of the implementation instance.

  • For any type T, the expression T? is shorthand for Nullable<T>, which represents a nullable version of the type T. A type is called nullable if compiler errors are not thrown when a null value of said type is attempted to be used. For more context on Nullable<T> is, see the below appendix.

Registering services (ServiceDescriptors) with IServiceCollection

So far, we know how to represent services (dependencies) as ServiceDescriptors. We’ll now learn how to create a managing container and how to register our services with said container.

An instance of type IServiceCollection is what will represent our managing container. From its interface definition, we can see that IServiceCollection a collection of  ServiceDescriptors. (So, IServiceCollection is interpreted as “I{ServiceCollection}“, which means “interface to a collection of services”, not “{IService}Collection“, which would mean “collection of interfaces to services”!).

using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;​
public interface IServiceCollection : ICollection<ServiceDescriptor>, IEnumerable<ServiceDescriptor>, IList<ServiceDescriptor> { }

Microsoft provides an implementation of IServiceCollection for us- the ServiceCollection class from the Microsoft.Extensions.DependencyInjection namespace- so we don’t have to take care of the implementation ourselves.

Service registration via extension methods to IServiceCollection

In order to store services in an IServiceCollection, we need to enable access to some extension methods to IServiceCollection.

(An extension method is an instance method of a class that is added to the class after the class is defined. Confusingly, you can add extension methods, which are non-abstract methods, to an interface. To learn more about extension methods, see the below appendix).

To obtain access to the extension methods we need, just include a using Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions statement at the top of the file.

Some important extension methods (with the parameter for the extended class, IServiceCollection, omitted) added by ServiceCollectionServiceExtensions are:

AddSingleton(Type serviceType, Type implementationType);
AddSingleton(Type serviceType); // is the above with implementationType = serviceType

Being extension methods to IServiceCollection, these methods are invoked on an instance of type IServiceCollection in the same way that usual instance methods are. For example, if services has type IServiceCollection, then we would call the above methods by writing

services.AddSingleton(serviceType, implementationType);
services.AddSingleton(serviceType);

You can probably surmise that these two methods add a ServiceDescriptor of lifetime Singleton that has the specified serviceType and implementationType to the IServiceCollection.

There are also versions of the above methods for which certain combinations of the parameters are held fixed:

AddSingleton<TService,TImplementation>()
AddSingleton<TService>(); // is the above with TImplementation = TService
AddSingleton<TService,TImplementation>(Func<IServiceProvider,TImplementation> implementationFactory)

And, of course, for every method whose name is AddSingleton, there will be corresponding methods with names of AddTransient and AddScoped that perform the same task for services of Transient and Scoped lifetimes, respectively.

Though, these two versions of AddSingleton, which specify the instance that is to be wrapped by the singleton service, don’t have AddTransient or AddScoped counterparts, because it wouldn’t make sense to specify only a single instance to AddTransient or AddScoped:

AddSingleton(Type serviceType, object implementationInstance);
AddSingleton<TService>(TService instance);

Resolving services at runtime with IServiceProvider

At this point, we know how to we know how to represent services (dependencies) as ServiceDescriptors, how to create how to create a managing container, and how to register our services with the container. The last item we need to address is that of configuring the resolving of services at runtime (i.e. configuring the injection of dependencies at runtime).

Let’s suppose that services is an IServiceCollection (i.e. a managing container) that contains some ServiceDescriptors (i.e. “services”, or dependencies).

To grab services from a managing container named services at runtime, we will first obtain an instance of type IServiceProvider from the managing container* by storing the return value of services.BuildServiceProvider() . Then, we grab a particular service by using the single abstract method specified in the IServiceProvider interface:

public object? GetService(Type serviceType)

* services.BuildServiceProvider returns an instance of Microsoft.Extensions.DependencyInjection.ServiceProvider, which implements IServiceProvider.

Somewhat random: creating IServiceCollections by using IServiceProviders

This section is pretty optional.

If you already have one IServiceCollection instance and corresponding IServiceProvider, and you want to create another IServiceCollection instance by making use of dependencies stored in the first IServiceCollection instance, you can use these extension methods to IServiceCollection:

AddSingleton(Type serviceType, Func<IServiceProvider, object> factory);
AddSingleton<TService,TImplementation>(Func<IServiceProvider,TImplementation> implementationFactory);
AddSingleton<TService>(Func<IServiceProvider, TService> implementationFactory); // is the above with TImplementation = TService

Appendix

This appendix documents some less commonly known language features of the C# language.

? and nullable reference types

A non-nullable type is a type for which compiler errors are thrown when a variable of that type with null value is attempted to be used . Contrastingly, a nullable type is a type for which compiler errors are not thrown in said situation. You can still get runtime errors with nullable types, of course! The whole point of non-nullable types is to avoid runtime errors by catching them at compilation.

According to the Microsoft documentation, all reference types were nullable prior to C# 8.0. Nowadays (i.e. after C# 8.0), all reference types are non-nullable by default.

You can still use nullable types if you really want, though. For any type T, the typeNullable<T> is nullable. ?T is shorthand for Nullable<T>.

Extension methods

In C#, it is possible to define instance methods outside of the corresponding class definition. Methods defined in this way are called extension methods.

Extension methods must be defined in a static class, and must use the this keyword in the following way:

public class Cls { ... }

​public static class Extension
{
     public static int extensionMethod1(this Cls cls)
     { int someValue = 0; return someValue; }       
     
     public static int extensionMethod2(this Cls cls, int arg)
     { int someValue = 0; return someValue; } 
}

Extension methods are called in the same way as regular instance methods: to call the above defined extension methods on an instance cls of Cls, you would write cls.extensionMethod() or cls.extensionMethod2(arg), respectively.

Extension methods to interfaces

Somewhat confusingly, it is possible to define extension methods- in exactly the same way as above- for interfaces. To me this possibility runs contradictory to the intent of “interface”- interfaces are not supposed to be associated with actual implementations of methods. But you can do it. It is also in fact impossible to add something like an “abstract extension method” to an interface. The C# standard library unfortunately makes much use of implementing interfaces via extension methods. Oh well.

References

I referenced the following two articles in developing my understanding of IServiceCollection: (1), (2).

]]>
https://blogs.perficient.com/2022/03/21/dependency-injection-in-c-net/feed/ 0 306533
How Jennifer Rostal Developed Her Passion into a Career https://blogs.perficient.com/2022/02/22/how-jennifer-rostal-developed-her-passion-into-a-career/ https://blogs.perficient.com/2022/02/22/how-jennifer-rostal-developed-her-passion-into-a-career/#comments Tue, 22 Feb 2022 21:04:11 +0000 https://blogs.perficient.com/?p=305081

Perficient encourages all colleagues to find their passion within the organization to grow both personally and professionally. Once a colleague recognizes their passion, Perficient supports them along their desired path within the organization, whenever possible. Jennifer Rostal, senior project manager in Minneapolis, Minnesota, is a prime example of someone who found their passion within Perficient and fully immersed herself within it.

When Jennifer discovered her interest in Scrum, she sought out opportunities to grow her interest into a passion. Now, a Certified Team Coach through Scrum Alliance, Jennifer is dedicated to using her expertise to help other colleagues build their skills and find their passions. We want to tell the stories of our people who are growing alongside our organization, and below, Jennifer discusses her continued growth, the journey along the way, and elaborates on her passion for helping others to grow professionally.

What is your role? Describe a typical day in the life.

My days as a senior project manager vary quite a bit! I typically have two or three internal initiatives that I’m focused on, all while providing support for other teams. I field a lot of questions about our Delivery Excellence frameworks and Scrum at Perficient. I do a little internal consulting on the side, helping our teams best serve our clients.

How does your role support Perficient? How are you making an impact?

Photography by Jennifer Rostal

I’ve been privileged to work on a variety of initiatives, such as our project frameworks that help standardize how we execute projects at Perficient. They provide consistency, but also flexibility to give our teams and project leaders the best possible experience. I also have the opportunity to teach Scrum Foundations on a regular basis and lead the Perficient Agile Community, helping our team members build their skills and adopt an agile mindset.

What are your proudest accomplishments, personally and professionally?

Professionally, I’m very proud of becoming a Certified Team Coach through the Scrum Alliance last year. It was a long but rewarding journey, and I hope I was able to help many Perficient teams and colleagues along the way. I’m also proud to be a Scrum Foundations educator. Through Scrum Foundations, I’ve had the opportunity to share my love of Scrum with more than 700 Perficient colleagues and clients. I also received Perficient’s Soaring Eagle award, which recognizes a Perficient leader who soars to their own personal heights, and also inspires others to achieve their own personal goals. This was an incredible honor for me.

On the personal side, I am proud to be a Full Blue. I was on the varsity fencing team for the University of Cambridge during graduate school. I fenced epee as captain of the squad, and also sabre. We won both the varsity matches against our rival, University of Oxford, and the national championships that year, and I was awarded a Full Blue for my contribution. I guess you could say I’ve always had a passion for teams!

What has your experience at Perficient taught you?

Photography by Jennifer Rostal

Find what you love and pursue it. For me, it was Scrum. I was very vocal about my love of Scrum and worked with my managers and general manager to take advantage of opportunities that would allow me to grow and use my skills. It’s taken me off the beaten path, so to speak, and allowed me to be an Agile coach, a Scrum Foundations instructor, start the Agile Community at Perficient, and transition into Delivery Excellence. Perficient is incredibly supportive, but it’s up to you to find what you love.

What advice would you give to colleagues who are starting their career with Perficient?

Explore your opportunities and get involved. Get to know people in other areas of the company. Join a group like the Agile Community (shameless plug, I know!) or one of our Employee Resource Groups. Find what you’re passionate about and ask for opportunities that will help you grow in that area.

What motivates you in your daily work?

Long term, knowing the work I do will make a difference for our project leaders, our team members, and Perficient as a whole keeps me motivated. I really appreciate the opportunity to impact a broad group rather than only working with a single team.

What are you passionate about outside of work?

I enjoy reading, cooking and baking, photography, borrowing dogs to play with, and knitting. So far this winter, I’ve knit and donated 45 hats to those experiencing homelessness during our brutally cold St. Paul winter, with more on the way.

What goals do you have for personal and professional development?

I have many! I want to use my Certified Team Coach designation to coach individuals and teams within Perficient and with our clients. I hope to coach individuals to the advanced and professional levels of Scrum Alliance certifications, such as Advanced Certified ScrumMaster or Product Owner. I had amazing mentors throughout my journey, and I’d love to pass it on by mentoring a few individuals toward their own Certified Team Coach designations, and mentor several people to become Scrum Foundations Educators. I also personally aspire to become a Certified Scrum Trainer so I can teach CSM, CSPO, and more!

When it comes to personal development, I’d love to spend time refreshing my knowledge of other languages. They are all very rusty and I’d like to practice more. Better yet, I’d like to be able to travel and actually use them!


SEE MORE PEOPLE OF PERFICIENT

It’s no secret our success is because of our people. No matter the technology or time zone, our colleagues are committed to delivering innovative, end-to-end digital solutions for the world’s biggest brands, and we bring a collaborative spirit to every interaction. We’re always seeking the best and brightest to work with us. Join our team and experience a culture that challenges, champions, and celebrates our people.

Visit our Careers page to see career opportunities and more!

Go inside Life at Perficient and connect with us on LinkedInYouTubeTwitterFacebook, and Instagram.

]]>
https://blogs.perficient.com/2022/02/22/how-jennifer-rostal-developed-her-passion-into-a-career/feed/ 1 305081